在silverlight/WP7应用程序中使用MVVM样式模式

Jor*_*ork 1 data-binding silverlight wpf mvvm windows-phone-7

我正在编写一个应用程序,我正在尝试使用MVVM样式架构来处理我的数据绑定(尽管我没有使用MVVM特定库,例如MVVM Light).我有一个类存储我的应用程序所需的所有信息,然后为每个屏幕分配一个视图模型到其DataContext,它只选择特定屏幕所需的值,必要时格式化数据.

例如,主数据存储看起来像这样:

class DataStore {
    int a, b, c;
    string d;
    DateTime e;
}
Run Code Online (Sandbox Code Playgroud)

然后分配给特定屏幕的视图模型就是这样的,它只使用了几个属性

class MainScreenViewModel {
    public int data1 { get { return App.DataStore.a * App.DataStore.c } }
    public int data2 { get { return App.DataStore.e.Day } }
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,当页面加载数据绑定时,它们应该填充.但是,它们不会在页面加载时自动更新.我已经在DataStore上实现了INotifyPropertyChanged,但似乎更改事件没有通过以反映在视图模型中.我敢肯定我这是一个非常糟糕的方式,所以如果有人能帮我指出正确的方向,我会非常感激.我在线阅读了一堆指南,但我似乎越来越困惑自己!

Sno*_*ear 5

您必须在VM上实施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
    }
}
Run Code Online (Sandbox Code Playgroud)

这里没有涉及的唯一部分是e.Day改变时的情景DataStore.

你的方法本身并不坏,绝对是好的开始.