#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");