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

时间:2011-06-13 10:11:27

标签: wpf silverlight data-binding windows-phone-7 mvvm

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

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

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

然后分配给特定屏幕的视图模型(仅使用多个属性)类似于

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

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

2 个答案:

答案 0 :(得分: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
    }
}

此处未涉及的唯一部分是e.DayDataStore将发生变化的情景。

你的方法本身并不坏,而且开始时肯定是好的。

答案 1 :(得分:0)

您绑定到MainScreenViewModel类,因此当基础数据更新时,需要为UI实现INotifyPropertyChanged的类才能更新。

您可以将逻辑移动到MainScreenViewModel并在那里提出属性更改通知,或者在PropertyChanged中处理DataStore上的MainScreenViewModel事件并提高属性更改通知适当的属性。