【问题标题】:WPF DataGrid two-way source binding to List<DataClass> programmatically以编程方式将 WPF DataGrid 双向源绑定到 List<DataClass>
【发布时间】:2012-03-21 19:08:06
【问题描述】:

我需要在运行时进行绑定,因为 DataGrid 将绑定到不同的数据源和/或类对象。我有两个课程 CA 和 CB。在 CB 中,有一种设置绑定的方法。但是下面的简单方式只设置了一种方式绑定。如何进行双向绑定? IE。当List&lt;CA&gt; 列表中的元素发生变化时,DataGrid1 将自动更新。

class CA
{
    private int a = 1;
    private string b = "";
    private bool c = true;
    public int A { get { return a; } set { a = value; } }
    public string B { get { return b; } set { b = value; } }
    public bool C { get { return c; } set { c = value; } }
}

class CB
{
    List<CA> datalist = new List<CA>();
    private void SetBinding(ref List<CA> ca, ref DataGrid dg)
    {
        dg.ItemsSource = ca;
    }
}

【问题讨论】:

  • 我认为同样重要的是要注意你不应该将 ca 或 dg 作为 ref 传递,除非你有一些非常令人信服的理由这样做(我无法想象。)

标签: c# wpf binding datagrid runtime


【解决方案1】:

为了正确绑定,你的类 CA 应该实现 INotifyPropertyChanged 接口。见:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx 并且所有属性都应该引发 propertyChanged 事件来通知数据绑定控件。

在这里你可以找到简单的例子:http://msdn.microsoft.com/en-us/library/ms229614.aspx

另外,我建议使用 ObservableCollection 而不是 List 与数据绑定,因为它具有开箱即用的 INotifyPropertyChanged 并通知数据绑定控件元素的添加、删除和更改。

【讨论】:

  • 你打败了我,但澄清一下,使用 ObservableCollection 仍然意味着 OP 需要在 CA 上实现 INotifyPropertyChanged。
  • 当然,随机对象的单个属性没有跟踪变化
【解决方案2】:

您的“CA”类将需要实现 INotifyPropertyChanged,以便 CA 对象的更改反映在您的数据网格中。

如果您还希望数据网格知道正在添加和删除的项目,那么您将需要使用 ObservableCollection 而不是 List 或至少是实现 INotifyCollectionChanged 的​​集合。

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2017-05-13
    相关资源
    最近更新 更多