Привязать ObservableCollection к DataGrid после назначения нового значения - PullRequest
3 голосов
/ 15 февраля 2011

Кажется, это простая проблема, но я не могу заставить ее работать.

У меня есть 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 ]

5 голосов
/ 15 февраля 2011

Авто-свойства к сожалению, не поддерживают уведомления об изменениях. Поэтому DataGrid не будет знать, что коллекция была изменена, если вы установите source -Property.

Одной из возможностей является реализация INotifiyPropertyChanged для messagesGrid.source -Property:

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 в UpperCase, потому что в .net свойства обычно пишутся так. Вы должны соответственно изменить свою привязку, потому что привязки чувствительны к регистру.

<data:DataGrid x:Name="dgMessages" Grid.Row="2" AutoGenerateColumns="True"  ItemsSource="{Binding Source}" ></data:DataGrid> 
1 голос
/ 15 февраля 2011

Проблема в том, что при изменении ссылки на 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);
  }
}
...