显示选定的组合框项目显示名称

时间:2011-11-30 21:36:38

标签: c# wpf mvvm

我有一个包含ValueMember="Id"DisplayMember="Id"的ComboBox,并希望在所选的Name中的某个值之后,在标签中显示所选的项目属性ComboBox。我正在使用某种MVVM pattern。因此,我将SelectedId绑定到模型,将ItemsSource绑定到 ViewModel 。 (如果我将ItemsSource放在模型中很容易 - 使用setter和OnPropertyChanged(),但现在我在模型中有很多只用于UI表示的字段< / p>

我设法使用combobox LostFocus事件显示所选项目的名称,我在其中使用LINQ调用ViewModel方法获取属性Name(来自List, 其中l.Id=Model.SelectedId)。

但是,有更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

可以直接绑定到标签的组合框:

     <ComboBox Name="MyCombo" ItemsSource="{Binding ComboListObjects}" SelectedItem="{Binding ComboSelection}" />
        <Label Content="{Binding ElementName=MyCombo, Path=SelectedValue}"/>

但是,由于您使用的是ViewModel,因此您应该稍微改变一下。 Combobox上没有SelectedId,所以我假设你的意思是SelectedValue。相反,我建议在ViewModel上创建一个属性来保存SelectedItem。我收录了一个样本:

视图模型:

public class MyViewModel : INotifyPropertyChanged
{
   public List<MyObject> ComboListObjects
    { 
        get{
            return new List<MyObject>();  // <-- fill this
        }
    }

    private MyObject _selectedItem = null;
    public MyObject ComboSelection
    {
        get { return _selectedItem; }
        set {
            _selectedItem = value;
            NotifyPropertyChanged("ComboSelection");
        }
    }
}

查看:

    <ComboBox Name="MyCombo" ItemsSource="{Binding ComboListObjects}" SelectedItem="{Binding ComboSelection}" />
    <Label Content="{Binding ComboSelection.Id}"/>
    <Label Content="{Binding ComboSelection.Name}"/>
    <Label Content="{Binding ComboSelection.OtherInfo}"/>

如果您打算使用MVVM,请避免使用代码隐藏,尤其是事件,除非您正在编写自定义控件。

希望有帮助...

答案 1 :(得分:0)

以下是如何将组合框绑定到书籍列表并使用MVVM在标签上显示书籍标题的示例。


在xaml标记中,使用ItemsSource和SelectedItem属性将组合框绑定到视图模型

<ComboBox Name="cbBook" ItemsSource="{Binding Books}"  SelectedItem="{Binding SelectedBook, Mode=TwoWay}" />
<Label DataContext="{Binding SelectedBook}" Content="{Binding Title}" />


在您的视图中,将DataContext设置为视图模型类

public partial class MyView : UserControl
{
    public MyView()
    {
        InitializeComponent();
        DataContext = new BookViewModel();
    }
}


视图模型应该具有您要绑定的公共属性。

public class BookViewModel : BaseViewModel
{
    public BookViewModel()
    {
       Books = new ObservableCollection<Book>();
    }

    public ObservableCollection<Book> Books { get; set; }

    private Book _selectedBook; 
    public Book SelectedBook 
    { 
       get { return _selectedBook; } 
       set
       {
          _selectedBook = value;
          NotifyPropertyChanged(() => SelectedBook); 
       }
    }
}


此基类实现INotifyPropertyChanged接口。我正在使用lambda表达式来实现类型安全。

public abstract class BaseViewModel : INotifyPropertyChanged
{
    protected void NotifyPropertyChanged<T>(Expression<Func<T>> expression)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(((MemberExpression)expression.Body).Member.Name));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}