[英]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.