2017-05-14 136 views
-1

该窗口包含一个ListBox和一个TextBlock,我的目的是在ListBox中的选择更改时更新TextBlock。OnPropertyChanged不更新UI

我有这个类:

class ViewModelMain : ViewModelBase 
{ 
    public ObservableCollection<MemEntity> items { get; set; } 
    public object SelectedItem 
    { 
     get 
     { 
      return _selectedItem; 
     } 
     set 
     { 
      _selectedItem = SelectedItem; 
      OnPropertyChanged("SelectedItem"); 
     } 
    } 

    public object _selectedItem { get; set; } 

    public ViewModelMain() 
    { 
     items = new ObservableCollection<MemEntity> { 
     new MemEntity{s = "a", Correct = 2, Incorrect = 1}, 
     new MemEntity{s = "b"}, 
     new MemEntity{s = "c"} 
     }; 
    } 
} 

这是ViewModelBase:

class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

的观点:

<ListBox x:Name="items" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding items}" DisplayMemberPath="s"/> 
<TextBlock Text="{Binding SelectedItem.s}"/> 

我想我现在已经在盒子的一切,但它不工作。我究竟做错了什么?

+0

'_selectedItem =的SelectedItem;'什么都不做。你有一个不使用'value'的setter。设置'_selectedItem = value;' – ASh

+0

尝试设置绑定模式为双向selectedItem –

回答

2

_selectedItem = SelectedItem;什么都不做。你有一个不使用value的二传手。让_selectedItem = value;

使用标准的片段来创建一个支持私人领域的财产(以concreate型):

private MemEntity _selectedItem; 
public MemEntity SelectedItem 
{ 
    get 
    { 
     return _selectedItem; 
    } 
    set 
    { 
     _selectedItem = value; 
     OnPropertyChanged("SelectedItem"); 
    } 
} 
+0

哇!我真的很接近。做一个尴尬的错误,但感谢整理出来。 – Pelle

+0

@Pelle这基本上是我给你提供给你的上一个问题的答案中的一个确切的重复。 – Nkosi

+0

@Nkosi,我实际上打开了前面的Q,但没有滚动到第二个答案。可惜,因为它确实是一个重复的答案。 – ASh