这似乎是一个简单的问题,但我无法让它发挥作用。
我有一个带有以下属性的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会更新,但事实并非如此。你能指出我做错了吗?
答案 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);
}
}