【问题标题】:WPF DataGrid is not rendered properly after Changing underlying collection更改基础集合后 WPF DataGrid 未正确呈现
【发布时间】:2010-11-18 06:52:53
【问题描述】:

这是我的代码:

<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();
    }

数据源是:

  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 反应是:我无法正确选择数据网格中对应于已删除Point 的单元格。它们没有被删除。这看起来像 UI 错误,有什么解决方法吗?

很抱歉,它太脏了 - 只是一个简单的示例。

谢谢,伊利亚

【问题讨论】:

    标签: c# wpf data-binding datagrid c#-4.0


    【解决方案1】:

    使用ObservableCollection&lt;&gt; 而不是List&lt;&gt; 作为 Lst - ObservableCollection 会在集合通过添加、删除或清除发生更改时自动通知。您还需要一个 DependencyProperty:http://forums.silverlight.net/forums/t/12664.aspx

    【讨论】:

    • 谢谢!现在我知道 ObservableCollection 的用途了 :)
    • 依赖属性不是必需的。您可以通过实现 INotifyPropertyChanged 和 INotifyCollectionChanged 接口来使用视图模型。
    【解决方案2】:

    如果将ItemSource 绑定到视图模型,您的集合应该实现INotifyCollectionChangedObsevableCollection 实际上是实现INotifyCollectionChanged 的集合,从而通知 WPF 控件添加和删除的元素。

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 2012-03-20
      • 2023-03-28
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多