WPF ComboBox MVVM数据绑定问题

时间:2014-03-11 19:30:09

标签: c# wpf data-binding mvvm

我有以下课程(我会保持这个简单。请假设我已经实现了INotifyPropertyChanged):

AddMovieViewModel 
{ 
   public Movie NewMovie {get;set;}

   public ObservableCollection<Language> LanguageList {get;set;}
}

Movie
{
   public Language MovieLanguage {get;set;}
}

Langauge
{
   public int LanguageID {get;set;}
   public string LanguageName {get;set;}
}

现在我有一个包含以下ComboBox的View(DataContext绑定到AddMovieViewModel):

<ComboBox ItemsSource="{Binding LanguageList}" Style="{x:Null}"
                      DisplayMemberPath="LanguageName" 
                      SelectedValuePath="LanguageID" 
                      SelectedItem="{Binding NewMovie.MovieLanguage, Mode=TwoWay}"
                      SelectedValue="{Binding NewMovie.MovieLanguage.LanguageID, Mode=TwoWay}" />

要求:假设我有一个AddMovieViewModel.LanguageList,其语言ID为1到5.该程序将首先从数据库中获取默认语言ID - 假设它是2.此LanguageID属于NewMovie对象,即NewMovie将将其MovieLanguage属性设置为LanguageID值为2的Language对象。现在,ComboBox应显示与LanguageID = 2对应的Language项。希望这不会引起混淆。

问题:我想知道,我是否必须从视图模型的LanguageList中检索相关的Language对象(具有LanguageID = 2),然后将其设置为NewMovie.MovieLanguage属性,如下所示:

NewMovie.MovieLanguage = LanguageList.First(lang => lang.LanguageID == 2);

或者有没有更好的替代方法来实现这一点而不使用Linq语法?这是正确的方法吗? NewMovie.MovieLanguage对象是否必须来自LanguageList集合才能将ComboBox显示为SelectedItem? Binding是执行一些散列检查还是尝试匹配LanguageID值?

1 个答案:

答案 0 :(得分:0)

SelectedItem 属性更新时,Combobox使用 object.Equals 来显示 ItemsSource 中的项目,因此您有多种方法可以实现期望的行为:

  1. 使用集合中的引用。实际上,这是Linq的例子。
  2. 在Language类中覆盖Equals方法。
  3. 使用SelectedIndex属性