【问题标题】:Raise PropertyChanged on custom properties in EntityObject在 EntityObject 中的自定义属性上引发 PropertyChanged
【发布时间】:2010-11-11 14:11:48
【问题描述】:

我在 EntityObject 上有几个自定义计算属性。我想触发 PropertyChanged 事件来通知所有绑定。但是,这不起作用,并且当我使用 ReportPropertyChanged 时会引发参数异常:

De eigenschap 名称 heeft geen geldige 实体操作 实体对象。文献资料 van Entity Framework 开始 信息。

这意味着Name 不是实体属性,我应该查看实体框架文档以获取更多信息。有什么方法可以调用事件并让实体框架忽略它?

代码示例:

partial class Preset
{
    public string Name
    {
        get
        {
            if (this.SystemPreset)
                return Translate("preset_" + this.Name_Original + "_name");
            else
                return this.Name_Original;
        }
        set
        {
            if (!value != this.Name_Internal)
            {
                this.Name_Internal = value;
                ReportPropertyChanged(Name);
            }
        }
    }
}

属性名称是自定义属性。当我尝试通过 EntityObject 中的 ReportPropertyChanged 方法触发 PropertyChanged 时,实体框架会抛出异常。

【问题讨论】:

  • 你能发布一些代码吗?例如,一个不工作的属性的代码。还有“ReportPropertyChanged”——那在哪里?
  • ReportPropertyChanged 是 EntityObject 中的一个方法,它触发 PropertyChanged 事件。问题是实体框架侦听此 PropertyChanged 事件并在未知属性上触发 ArgumentException。

标签: .net entity-framework-4 inotifypropertychanged


【解决方案1】:

您应该能够从您的自定义属性设置器中调用OnPropertyChanged("YourPropertyName") (msdn),然后 WPF 将接收它。

这适用于我在 Visual Studio 2010 中,.NET 4.0 与 SQLServer CE 数据库通信(我认为它是实体框架 4,但我不确定)。

【讨论】:

    【解决方案2】:

    ReportPropertyChanged 不是供您使用的,它是供 EF 通知 ObjectStateManager 更改该对象的 CurrentValues 以便它可以跟踪当我们在 ObjectContext 上调用 SaveChanges 时,并在稍后生成适当的 SQL 命令。

    也就是说,每个实体的每个标量属性都有自己的 2 个部分方法版本供您实现:On[Property]Changed关于[属性]更改
    PropertyChanging 和 PropertyChanged 没有默认实现;只是一个声明。这使您有机会在属性即将更改 (PropertyChanging) 以及属性值更改后 (PropertyChanged) 执行自定义逻辑,您可以使用它们来更新自定义计算属性的值。

    【讨论】:

    • 我想要的是能够为我在部分类中添加的自定义属性触发 PropertyChanged 事件,而不是对实体框架生成的属性的更改进行操作..
    • 那么你不需要任何特殊的方法或事件,你可以在你的自定义属性的setter方法中做你需要做的事情。 EF 不知道您的自定义属性,因此,没有开箱即用的 API 可供您使用。你的具体情况是什么?
    • 问题不在于调用事件,问题在于实体框架抛出异常,因为它也在监听我的自定义属性的 PropertyChanged 事件。
    • 现在我看到了你的代码,你需要从 Name 属性的设置器中完全删除 ReportPropertyChanged(Name);,你不需要在你的自定义属性中,你应该不叫它。
    • 我愿意,因为没有其他方法可以调用 EntityObject 类中实现的 PropertyChanged 事件。
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多