如何从ListBox中选择的项目获取特定属性

时间:2017-05-14 12:20:05

标签: c# wpf listbox

我有以下内容:

<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中显示的属性相同)。这不起作用,所以我做错了什么?

2 个答案:

答案 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属性发生更改,视图就会知道,并会相应地更新视图。