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。

INotifyPropertyChanged in WPF

问题是您直接将原始列表设置到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");