我正在编写一个应用程序,我正在尝试使用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,但似乎更改事件没有通过以反映在视图模型中。我敢肯定我这是一个非常糟糕的方式,所以如果有人能帮我指出正确的方向,我会非常感激。我在网上看过一堆指南,但我似乎越来越困惑自己了!
答案 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.Day
中DataStore
将发生变化的情景。
你的方法本身并不坏,而且开始时肯定是好的。
答案 1 :(得分:0)
您绑定到MainScreenViewModel
类,因此当基础数据更新时,需要为UI实现INotifyPropertyChanged
的类才能更新。
您可以将逻辑移动到MainScreenViewModel
并在那里提出属性更改通知,或者在PropertyChanged
中处理DataStore
上的MainScreenViewModel
事件并提高属性更改通知适当的属性。