INotifyPropertyChanged в WPF

#c# #wpf #data-binding #inotifypropertychanged

#c# #wpf #привязка данных #inotifypropertychanged

Вопрос:

Попытайтесь понять 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>
  

Как заставить этот код работать? Я хочу, чтобы данные со списком были изменены после того, как я нажму на кнопку, и мой список будет обновлен. PropertyChangedEventHandler всегда равен нулю.

Ответ №1:

Проблема в том, что вы напрямую устанавливаете исходный список на Window.DataContext , поэтому ничто никогда не прослушивает PropertyChanged событие Windows.

Чтобы решить эту проблему, установите DataContext для самого окна:

 this.DataContext = this;
  

а затем измените Binding , поэтому обратитесь к свойству:

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

Вам также нужно будет изменить определение вашего свойства таким образом, чтобы оно вызывало имя изменяемого свойства, а не имя элемента:

 this.RaisePropertyChanged("MyList");
  

Ответ №2:

Я думаю, у вас две проблемы:

1) привязка должна быть: {Binding MyList}

2) в установщике myList вы должны использовать RaisePropertyChanged("MyList");