我有以下内容:
<ListBox SelectedItem="{Binding SelectedItem}"
ItemsSource="{Binding items}" DisplayMemberPath="s"/>
<TextBlock Text="{Binding SelectedItem.s}"/>
这是SelectedItem
public MemEntity SelectedItem {get; set;}
MemEntity
是一个包含
public String s {get; get;}.
基本上,我希望所选项目的显示在TextBlock
中(与ListBox
中显示的属性相同)。这不起作用,所以我做错了什么?
答案 0 :(得分:2)
试试这个,
<TextBlock ... Text="{Binding ElementName=items, Path=SelectedItem.s}" />
然后将名称添加到ListBox中,
<ListBox x:Name="items" SelectedItem="{Binding SelectedItem}"
ItemsSource="{Binding items}" DisplayMemberPath="s"/>
答案 1 :(得分:2)
有多种方法可以做到这一点。在另一个答案中已经提供了一个选项,该选项集中于通过绑定到视图元素来实现期望的功能。这是另一种选择。
视图未发现所选项目已更改。考虑使用INotifyPropertyChanged
您可以创建一个基本ViewModel来封装重复的功能
public abstract class ViewModelBase : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged = delegate { };
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
让视图模型继承自此基类,以便视图在绑定时了解更改。
public class ItemsViewModel : ViewModelBase {
public ItemsViewModel() {
items = new ObservableCollection<MemEntity>();
}
private MemEntity selectedItem;
public MemEntity SelectedItem {
get { return selectedItem; }
set {
if (selectedItem != value) {
selectedItem = value;
OnPropertyChanged(); //this will raise the property changed event.
}
}
}
public ObservableCollection<MemEntity> items { get; set; }
}
现在,只要SelectedItem
属性发生更改,视图就会知道,并会相应地更新视图。