在分配新值后,将ObservableCollection绑定到DataGrid

时间:2011-02-14 22:54:28

标签: data-binding datagrid silverlight-3.0 observablecollection

这似乎是一个简单的问题,但我无法让它发挥作用。

我有一个带有以下属性的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 个答案:

答案 0 :(得分:5)

Auto-properties遗憾地不支持更改通知。因此,如果设置source - 属性,DataGrid将不会知道集合已被更改。

一种可能性是为messagesGrid.source实施INotifiyPropertyChanged - 属性:

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

请注意,我在UpperCase中写了Source的第一个字母,因为在.net中,属性通常是这样写的。您必须相应地更改绑定,因为绑定区分大小写。

<data:DataGrid x:Name="dgMessages" Grid.Row="2" AutoGenerateColumns="True"  ItemsSource="{Binding Source}" ></data:DataGrid> 

答案 1 :(得分:1)

问题在于,当您点击按钮时source的引用发生更改时,没有任何内容可以告诉UI自行更新。您需要将source作为依赖项属性,或者实现INotifyPropertyChanged,并在PropertyChanged的setter中调用source事件。

private ObservableCollection<HL7Message> source;
public ObservableCollection<HL7Message> Source 
{ 
  get
  {
    return this.source;
  }

  set
  {
    this.source = value;
    this.NotifyPropertyChanged(() => this.Source);
  }
}