【问题标题】:WPF ComboBox MVVM DataBinding IssueWPF ComboBox MVVM 数据绑定问题
【发布时间】:2014-03-11 19:30:08
【问题描述】:

我有以下类(我会保持简单。请假设我已经实现了 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 bound to 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,其 LanguageID 从 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 值?

【问题讨论】:

    标签: c# wpf data-binding mvvm


    【解决方案1】:
    SelectedItem 属性已更新时,

    Combobox 使用 object.Equals 显示来自 ItemsSource 的项目,因此您有多种方法可以实现期望的行为:

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

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2010-10-11
      • 2011-07-05
      相关资源
      最近更新 更多