【问题标题】:Using BindingSource to bind to Nested Properties - or, Making Entities Bindable使用 BindingSource 绑定到嵌套属性 - 或者,使实体可绑定
【发布时间】:2011-07-01 13:20:57
【问题描述】:

绑定到嵌套属性很简单:

checkBox1.DataBindings.Add(new Binding("Checked", bindingSource, "myProperty")); //Normal binding
checkBox2.DataBindings.Add(new Binding("Checked", bindingSource, "myProperty.innerProperty")); //Nested property

但是,当 myProperty.innerProperty 更改时,不会引发任何事件 - BindingSource 永远不会收到更改通知。

read 认为解决方案是“确保当innerProperty 对象引发PropertyChanged 事件时,包含innerPropertyMyProperty 类会捕获该事件并引发PropertyChanged 自己的事件。”

但是,实体框架does not do this for me,我宁愿不要遍历每个类的每个实例,并为每个导航属性连接一个自定义方法,只是为了使我的类可绑定。 是否有合适的解决方法使实体可绑定?

【问题讨论】:

  • 这里有一些魔豆……啊,见鬼,我对你有感觉;让我放弃讽刺。这个问题没有灵丹妙药(或 bean)。最适合您的解决方案是使用 EF4 T4 模板并重写它们,以便 myProperty 侦听对 innerProperty 的更改。
  • 唯一的方法是引入一些包装器类型,它们将封装 EF 类型并以您想要的方式传播更改通知。
  • 您可能不想听到它,但不要绑定到您的实体。使用 MVVM 和 automapper 之类的东西来减少映射的乏味。我之前一直走在实体绑定的道路上,最终你的实体类中有太多支持 UI 的花言巧语,以至于手动映射 ViewModel 开始看起来很有吸引力。
  • 您是否尝试过您引用的 MS Connect 问题中提到的解决方法? (connect.microsoft.com/VisualStudio/feedback/details/532257)

标签: c# .net winforms entity-framework data-binding


【解决方案1】:

你必须在你的类上实现 INotifyPropertyCHanged。

您的属性应该如下所示。

private bool _checked;
    public bool Checked
    {
        get { return _checked; }
        set
        {
            if (value != _checked)
            {
                _checked = value;
                OnPropertyChanged("Checked");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public virtual void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyCHanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

我不确定这是否适用于 winform。它适用于 WPF 和 Silverlight。

【讨论】:

  • 最好使用一些 MvvM 模式来执行此操作
  • "Checked" 是我们要绑定 to 而非绑定 from 的属性的名称。然而,更重要的是,我已经在问题中提到了这个答案——但这不是 EF 中的选项。
【解决方案2】:

您可以尝试 POCO 实体生成器或 EF Code-First 功能,该功能仍在 CTP 中。

不过,这两种方法都需要 EF4。

【讨论】:

    【解决方案3】:

    您的属性是否通过 UI 使用的相同上下文进行更改?

    如果是这样,请编辑用于创建实体的 T4 文件。
    - 使其创建 INotifyPropertyChanged 实体,具有通知更改的属性并在后面有一个显式字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2012-07-19
      • 2019-04-28
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多