2011-06-13 114 views
1

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

作为一个例子,主数据存储看起来是这样的:

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,但似乎change事件不会通过视图模型反映出来。我确信我正在讨论这种非常糟糕的方式,所以如果有人能帮助我指出正确的方向,我会非常感激。我在网上阅读了一堆指南,但我似乎越来越困惑自己!

回答

5

您必须在虚拟机上执行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更改方案。

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

+0

谢谢,这似乎是我想要做的。你是什​​么意思/ /在RaisePropertyChanged提高它? – 2011-06-13 10:22:42

+0

得到它的工作,谢谢 – 2011-06-13 10:25:51

+0

@Jordan,'提高它'意味着'提高PropertyChanged'。我懒得完全输入:) – Snowbear 2011-06-13 10:26:50

0

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

您既可以移动逻辑放到MainScreenViewModel,提高属性更改通知出现,或在MainScreenViewModel处理上DataStorePropertyChanged事件,提高属性相应的属性改变的通知。

相关问题