繁体   English   中英

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

[英]Using MVVM style pattern in silverlight/WP7 application

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

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

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

然后视图 model 分配给特定屏幕,它只使用几个属性,就像

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

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

您必须在您的 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.Day将在DataStore中更改的场景。

你的方法本身并不坏,而且绝对足够好开始。

您正在绑定到MainScreenViewModel class,因此 class 需要实现INotifyPropertyChanged以便 UI 在基础数据更新时得到更新。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM