【发布时间】:2014-12-01 06:56:37
【问题描述】:
我正在尝试在DataGrid 和Collection 之间实现双向绑定。
我想要的是删除我的Collection 中的一个项目会自动导致DataGrid 项目被删除,有没有可能做到?
到目前为止我所做的是:
我的收藏项的代码。
[XmlRoot("configitem")]
public class ConfigItem : INotifyPropertyChanged
{
private bool bDelete = false;
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("value")]
public string Value { get; set; }
public bool ToBeDelete {
get
{
return bDelete;
}
set
{
bDelete = value;
OnPropertyChanged("ToBeDelete");
}
}
[XmlAttribute("description")]
public string Description { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
XAML 代码是:
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<CheckBox Content="All" x:Name="chkAll" Click="chkAll_Click" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="chkSelect" IsChecked="{Binding ToBeDelete,
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="15 2 0 0" Click="chkSelect_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="2*" Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="ConfigName"/>
<DataGridTextColumn Width="2*" Binding="{Binding Value}" ClipboardContentBinding="{x:Null}" Header="ConfigValue"/>
<DataGridTextColumn Width="6*" Binding="{Binding Description}" ClipboardContentBinding="{x:Null}" Header="Description"/>
</DataGrid.Columns>
当我单击第一列中的复选框时。
PropertyChanged 事件将被触发。这将使集合项的值发生变化。并且它起作用了。
当我单击删除按钮时。我尝试从当前绑定集合中删除指定的项目。集合项目被删除。但是为什么他们的网格行没有被删除?
public void Delete()
{
List<ConfigItem> TobeRemovedList = configs.Where(x => x.ToBeDelete.Equals(true)).ToList();
TobeRemovedList.ForEach(x => configs.Remove(x));
}
我是否需要在删除按钮中再次调用绑定,以便 DataGrid 知道集合已更改?
如果我所做的与最佳实践相去甚远。请告诉我如何。谢谢。
【问题讨论】: