2017-05-14 60 views
1

選擇特定的屬性我有以下幾點:如何從項目在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(sam如ListBox所示)。這不起作用,所以我做錯了什麼?

+1

該視圖不知道所選項目已更改。看看使用'INotifyPropertyChanged'我看到了 – Nkosi

+0

。我將實施界面並提高活動。 – Pelle

+0

你在申請MVVM嗎? – Nkosi

回答

2

試試這個,

<TextBlock ... Text="{Binding ElementName=items, Path=SelectedItem.s}" /> 

然後到你的列表框添加一個名字,

<ListBox x:Name="items" SelectedItem="{Binding SelectedItem}" 
     ItemsSource="{Binding items}" DisplayMemberPath="s"/> 
+0

使用MVVM時不需要NotifyPropertyChanged,對嗎?因爲我無法得到這個工作(或更新)。 – Pelle

+0

你需要它來綁定 – Sajeetharan

2

有這樣做多的方式。在另一個答案中已經提供了一種選擇,其側重於通過綁定到視圖元素來實現期望的功能。這是另一種選擇。

該視圖不知道所選項目已更改。考慮使用INotifyPropertyChanged

您可以創建一個基地視圖模型來封裝重複功能

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性質的變化並相應地更新視圖。

+0

其實,我無法得到任何更新。儘管我在前面的答案中添加了綁定,以及INotifyPropertyChanged。 – Pelle