2012-07-05 110 views
0

我想了解WPF中的MVVM模式,並且遇到了綁定和集合的一些問題。我不喜歡綁定到集合的索引,因爲集合更改。如何綁定到集合而不使用集合的索引?

MyModelClass : ObservableCollection<MyData>

MyData類有一個名爲它DataValue握着我的自定義信息屬性。我用MyData對象填充MyModelClass。在視圖模型類(MyViewModel)中,我有一個MyModelClass類型的屬性CurrentData

現在在這種情況下,我的綁定是一個組合框。 下面是綁定的樣子:

<ComboBox Name="cmbxData" 
    ItemsSource="{Binding Path=CurrentData}" 
    DisplayMemberPath="DataValue" 
    SelectedValuePath="DataValue" 
    SelectedValue="{Binding Path=CurrentData[0].DataValue}"/> 

這一切工作正常和MyViewModel類具有的PropertyChanged通知的接口設置。 我需要每隔幾秒刷新一次信息。

我做的MyModelClass內像這樣清爽的集合:

public Class MyModelClass : ObservableCollection<MyData> 
{ 
    private static MyModelClass current = null; 
    public static MyModelClass Current 
    { 
     get 
     { 
      if(current == null) 
       current = new MyModelClass(); 

      return current; 
     } 
    } 

    private void UpdateModel(MyData newData) 
    { 
     MyModelClass newModel = new MyModelClass(); 
     newModel.Add(newData); 
     current = newModel; 

    } 
} 

裏面MyViewModel有這樣的:

MyModelClass CurrentData = MyModelClass.Current; 

我盡力給儘可能多的代碼,因爲我可以並保持簡單。請讓我知道是否還有需要澄清。感謝您就如何解決我的問題提出任何建議。

如果你錯過了它: 問題:我如何綁定到集合,或者我想在集合中顯示的值,而不使用像上面顯示的索引(SelectedValue="{Binding Path=CurrentData[0].DataValue}")?我該如何解決這個問題或者改變我的實施方案是否正確?

感謝,

+0

爲什麼當您只需要集合中的一個項目時實現集合類型?如果你想要當前項目,你需要另一個屬性,指向當前項目 – Charleh 2012-07-05 15:27:54

+0

我同意這也讓我感到困惑,但那是我遇到的另一個問題,當屬性發生變化時,我無法獲得綁定更新,除非它是在一個集合中。但是,這是與這個問題分開的問題。 – therealjohn 2012-07-05 15:44:41

回答

0

添加上MyModelClass稱爲 「SelectedData」 或類似的東西的屬性。 然後將該屬性綁定到ComboBox的SelectedItem屬性

+0

好吧,我會試試這個。感謝您的建議。 – therealjohn 2012-07-05 15:45:18

+0

確保你使它成爲一個依賴屬性,否則它將不會通知UI自身的變化 - 這可能是你之前出錯的地方 - 爲了澄清,一個依賴屬性會在屬性改變時通知,而不是在基礎對象更改 - 這對'SelectedItem'很有用。如果您還希望底層對象通知它需要實現.NET通知接口(INotifyPropertyChanged) – Charleh 2012-07-05 15:46:42

+0

感謝您的澄清。我接受這一點是因爲你確實回答了我原來的問題。通知到用戶界面是一個單獨的主題。再次感謝您的建議和幫助。 – therealjohn 2012-07-05 15:47:36