Привязка ObservableCollection к DataGrid после присвоения нового значения
Это кажется простой проблемой, но я не могу заставить ее работать.
У меня есть UserControl со следующим свойством:
public ObservableCollection<HL7Message> source {get; set;}
И следующая привязка:
<data:DataGrid x:Name="dgMessages" Grid.Row="2" AutoGenerateColumns="True"
ItemsSource="{Binding source}" ></data:DataGrid>
Из родительского UserControl я устанавливаю значение при нажатии кнопки:
messagesGrid.source = src; //messagesGrid is the name of the UserCntrol above
Я ожидаю, что моя DataGrid будет обновлена, но это не так. Не могли бы вы указать на то, что я делаю неправильно?2 ответа:
Авто-свойства , к сожалению, не поддерживают уведомления об изменениях. Поэтому DataGrid не будет знать, что коллекция была изменена, если вы установите свойство
source
-.Можно реализовать INotifiyPropertyChanged в
messagesGrid.source
-имущество:Обратите внимание, что я написал первую буквуclass YourUserControlClass: INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { if (null != PropertyChanged) { PropertyChanged(this,e); } } ObservableCollection<HL7Message> m_source; public ObservableCollection<HL7Message> Source { g get{return m_source;} set{ if(value != m_source){ m_source=value; OnPropertyChanged("Source"); } } } ....
Source
в верхнем регистре, потому что в .net свойства обычно пишутся так. Вы должны соответствующим образом изменить привязку, потому что привязки-это регистр чувствительный.<data:DataGrid x:Name="dgMessages" Grid.Row="2" AutoGenerateColumns="True" ItemsSource="{Binding Source}" ></data:DataGrid>
Проблема в том, что когда ссылка на
source
изменяется по щелчку кнопки, нет ничего, чтобы сказать пользовательскому интерфейсу обновить себя. Вам нужно будет либо создать свойствоsource
зависимостей, либо реализоватьINotifyPropertyChanged
и вызвать событиеPropertyChanged
в сеттере дляsource
.private ObservableCollection<HL7Message> source; public ObservableCollection<HL7Message> Source { get { return this.source; } set { this.source = value; this.NotifyPropertyChanged(() => this.Source); } }