这是我的代码:
<Grid>
<Button Content="Button" Click="button1_Click" />
<DataGrid ItemsSource ="{Binding Lst}" />
</Grid>
代码隐藏:
private void button1_Click(object sender, RoutedEventArgs e)
{
(this.DataContext as Some).remove();
}
DataSource是:
public class Some : INotifyPropertyChanged
{
private List<Point> lst = new List<Point>();
public List<Point> Lst
{
get
{
return lst;
}
}
public Some()
{
lst.Add(new Point(2.3, 5));
lst.Add(new Point(267.3, 5));
lst.Add(new Point(2.3, 65));
lst.Add(new Point(2.63, 885));
lst.Add(new Point(27.3, 65));
}
public void remove()
{
lst.Remove(lst.Last());
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Lst"));
}
public event PropertyChangedEventHandler PropertyChanged;
}
当我调用remove()
方法时,我从集合中删除项目并调用propertychanged。 UI反应是:我无法正确选择datagrid中与已删除Point
对应的单元格。它们不已删除。这看起来像UI bug,有没有解决方法?
很抱歉它太脏了 - 只是一个快速的样本。
谢谢,伊利亚
答案 0 :(得分:2)
对于Lst使用ObservableCollection<>
而不是List<>
- ObservableCollection会自动通过添加,删除或清除来通知集合何时更改。您还需要一个DependencyProperty:http://forums.silverlight.net/forums/t/12664.aspx
答案 1 :(得分:1)
我将ItemSource
绑定到视图模型,您的集合应该实现INotifyCollectionChanged
。 ObsevableCollection
实际上是实现INotifyCollectionChanged
的集合,从而通知WPF控件添加和删除的元素。