2011-06-13 159 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事件,提高屬性相應的屬性改變的通知。

相關問題