Использование шаблона стиля MVVM в приложении silverlight / WP7 - PullRequest
1 голос
/ 13 июня 2011

Я пишу приложение, в котором я пытаюсь использовать архитектуру стиля MVVM для обработки привязки данных (хотя я не использую библиотеку, специфичную для MVVM, например, MVVM Light).У меня есть класс, в котором хранится вся информация, которая требуется моему приложению, а затем каждому из экранов присваивается модель представления его DataContext, который просто выбирает значения, необходимые для конкретного экрана, форматируя данные при необходимости.

Например, основное хранилище данных выглядит примерно так:

class DataStore {
    int a, b, c;
    string d;
    DateTime e;
}

И тогда модель представления, выделенная для определенного экрана, который использует только несколько свойств, выглядит примерно так:1006 *

class MainScreenViewModel {
    public int data1 { get { return App.DataStore.a * App.DataStore.c } }
    public int data2 { get { return App.DataStore.e.Day } }
}

Кажется, это работает нормально, когда страница загружается, привязки данных заполняются, как и должно быть.Однако они не обновляются автоматически при загрузке страницы.Я реализовал INotifyPropertyChanged в хранилище данных, но кажется, что событие изменения не всплывает, чтобы отразиться в модели представления.Я уверен, что я иду по этому очень плохому пути, поэтому, если кто-нибудь сможет помочь мне направить меня в правильном направлении, я буду очень благодарен.Я прочитал пачку руководств в Интернете, но, похоже, я все больше путаюсь!

Ответы [ 2 ]

5 голосов
/ 13 июня 2011

Вы должны реализовать INotifyPropertyChanged и повысить PropertyChanged на своей виртуальной машине.Для этого вам нужно будет прослушать DataStore.PropertyChanged.Пример:

class MainScreenViewModel {
    public int data1 { get { return App.DataStore.a * App.DataStore.c } }
    public int data2 { get { return App.DataStore.e.Day } }


    public MainScreenViewModel()
    {
         App.DataStore.PropertyChanged += (sender, e) => 
                 {
                     if (e.PropertyName == "a" || e.PropertyName == "c")
                         RaisePropertyChanged("data1");
                     if (e.PropertyName == "e")
                         RaisePropertyChanged("data2");
                 };
    }

    private void RaisePropertyChanged(string propertyName)
    {
        // raise it
    }
}

Единственная часть, не охваченная здесь, - это сценарий, когда e.Day изменится в DataStore.

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

0 голосов
/ 13 июня 2011

Вы привязываетесь к классу MainScreenViewModel, поэтому именно этот класс должен реализовать INotifyPropertyChanged, чтобы пользовательский интерфейс обновлялся при обновлении базовых данных.

Вы можете либо переместить логику в MainScreenViewModel и вызвать там уведомление об изменении свойства, либо обработать событие PropertyChanged в DataStore в MainScreenViewModel и вызвать уведомление об изменении свойства для соответствующих свойств.

...