Как сделать статический класс, который обновлял себя? (похоже на мышь)

Мышь, как вы знаете, является статическим классом. У него есть статическое свойство с именем Mouse.Position. Это свойство обновляется динамически (возможно, привязывается к мыши ??). (Я прочитал документацию по мыши в msdn)

Мне нужно построить тот же класс с этим сценарием.

Я делаю приложение, которое может иметь несколько страниц, и каждая из страниц разделяет, например, значение Margin.

Есть 2 варианта (я думаю), чтобы сделать это:

  1. Создайте поле в классе «страница» и передайте значение через конструктор (самый простой)
  2. Статический класс, аналогичный использованию Mouse.Position, но в данном случае, например, PageInformation.Margin (PageInformation — это класс, а не свойство и не поле)

Я предпочитаю второй вариант, так как его легче отлаживать (я думаю), и сделать класс Page более чистым, без кода и проще во время обновления, если Margin каким-то образом изменился пользователем.

Кто-нибудь знает, как это сделать? (предпочтительный способ mvvm)

Спасибо.

ОБНОВЛЕНИЕ: P.S. Я уже понимаю базовую практику mvvm (INPC и тому подобное)

Это общий код в моем приложении:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    ...
}

public class SheetPage : ViewModel
{
    ...
}

person Moses Aprico    schedule 04.09.2014    source источник
comment
Это вопрос об архитектуре или вы хотите знать, как реализовать INotifyPropertyChanged? - для первого: я не думаю, что наличие поля страницы в качестве глобальной переменной - хорошая идея, и почему это должно быть легче отлаживать? Глобальные переменные, как правило, усложняют понимание и отладку в долгосрочной перспективе.   -  person Random Dev    schedule 04.09.2014
comment
Я думаю, что это больше об архитектуре. Не знаю о глобальной переменной tbh. это то, что Mouse.Position тоже делает?   -  person Moses Aprico    schedule 04.09.2014
comment
Вы не знаете? И даже в примере с мышью вы могли бы поспорить (немного опираясь на мнение), является ли это хорошим дизайном для ООП, но, по крайней мере, раньше в вашей системе был только один указатель мыши — касание тоже изменило это, кстати.   -  person Random Dev    schedule 04.09.2014
comment
@CarstenKönig, я имею в виду, что никогда раньше не использовал глобальную переменную.   -  person Moses Aprico    schedule 04.09.2014
comment
Посмотрите здесь более современный обработчик INotifyPropertyChanged .   -  person nvoigt    schedule 04.09.2014


Ответы (1)


Ваш класс будет синглтоном, и поэтому модульное тестирование практически невозможно. Это не кажется очень практичным решением.

В WPF вы можете привязать все поля всех страниц к одному и тому же свойству ViewModel. Таким образом, когда ваше свойство ViewModel изменится (при условии, что вы правильно реализовали INotifyPropertychanged или использовали DependencyProperty), все ваши поля также изменятся.

person nvoigt    schedule 04.09.2014
comment
Итак, тогда лучше сделать это, передав структуру Thickness, также известную как Margin, из MainWindowVM в SheetPageVM? - person Moses Aprico; 04.09.2014
comment
@MosesAprico, вы можете получить доступ к Margin непосредственно из вашего MainWindowVM в привязке XAML, найдя предка - person WiiMaxx; 04.09.2014