Привязка 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 3

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);
  }
}