WPF中的INotifyPropertyChanged

4

尝试理解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。
2个回答

10
问题在于您直接将原始列表设置为 Window.DataContext,因此没有任何东西会监听窗口的 PropertyChanged 事件。

要解决这个问题,请将 DataContext 设置为窗口本身:

this.DataContext = this;

然后更改Binding以引用该属性:

<ComboBox ItemsSource="{Binding MyList}" />

您还需要更改属性定义,以便提高正在更改的属性的名称,而不是成员的名称:

this.RaisePropertyChanged("MyList");

2

我认为你有两个问题:

1) 绑定应该是:{Binding MyList}

2) 在MyList的setter中,你应该使用RaisePropertyChanged("MyList");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接