2012-07-05 107 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