我有一个包含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
)。
但是,有更简单的方法吗?
答案 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;
}