当下面的代码在没有它的情况下正常工作时,实现INotifyPropertyChanged
的用途是什么?
<DataGrid ItemsSource="{Binding Items}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name}"/>
<DataGridComboBoxColumn Header="Color"
SelectedItemBinding="{Binding Color}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Colors}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Colors}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
<Button Content="Change Colors" Click="Change"/>
public class Data
{
private ObservableCollection<Item> _items;
public ObservableCollection<Item> Items
{
get { return _items; }
}
public Data()
{
_items = new ObservableCollection<Item>();
_items.Add(new Item() { Name = "A" });
_items.Add(new Item() { Name = "B" });
}
public void Change()
{
_items[0].Colors.RemoveAt(1);
}
}
public class Item
{
public string Name { get; set; }
public string Color { get; set; }
private IList<string> _colors;
public IList<string> Colors
{
get { return _colors; }
}
public Item()
{
_colors = new List<string> { "Green", "Blue" };
Color = _colors[0];
}
}
答案 0 :(得分:4)
ObservableCollection<T>
实现了INotifyCollectionChanged
和INotifyPropertyChanged
接口,因此如果您只是希望能够在运行时添加和删除源集合中的项目,则无需实现INotifyPropertyChanged
界面。
如果您希望能够动态更新Item
或Name
属性,则必须在自定义Color
类中实现它。
如果将Name
的{{1}}属性设置为新值,除非Item
类实现Item
接口,否则不会反映在视图中在Name属性的setter中引发INotifyPropertyChanged
事件。
如果我希望在集合发生变化时拥有自定义功能,该怎么办?例如抛出一条消息!我应该使用List而不是ObservableCollection并将该消息抛出属性的''set'吗?
您可以处理PropertyChanged
的{{1}}事件。