INotifyPropertyChanged in WPF
本文关键字:WPF in INotifyPropertyChanged | 更新日期: 2023-09-27 18:13:50
试着理解WPF。这是我的测试类:
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection<string> _myList = new ObservableCollection<string>();
public ObservableCollection<string> MyList
{
get { return _myList; }
set
{
_myList = value;
RaisePropertyChanged("_myList");
}
}
public MainWindow()
{
InitializeComponent();
comboBox1.DataContext = _myList;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
MyList = AnotherClass.SomeMethod();
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
internal static class AnotherClass
{
public static ObservableCollection<string> SomeMethod()
{
return new ObservableCollection<string> {"this","is","test"};
}
}
这是XAML
<Grid>
<ComboBox Height="23" HorizontalAlignment="Left" Margin="65,51,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding}" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="310,51,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
如何使这段代码工作?我想要的ComboBox数据将改变后,我点击按钮和MyList更新。PropertyChangedEventHandler总是null。
问题是您直接将原始列表设置到Window.DataContext
上,因此没有任何东西侦听windows的PropertyChanged
事件。
要解决这个问题,将DataContext
设置为窗口本身:
this.DataContext = this;
,然后更改Binding
,以便引用属性:
<ComboBox ItemsSource="{Binding MyList}" />
你还需要修改你的属性定义,这样它就会引发属性被修改的名字,而不是成员的名字:
this.RaisePropertyChanged("MyList");
我认为你有两个问题:
1) binding应该是:{Binding MyList}
2)在MyList setter上你应该使用RaisePropertyChanged("MyList");