Schrodinger的对象:除非我检查它的值代码端,否则WPF属性不会绑定/更新?

时间:2014-03-21 19:15:11

标签: c# wpf entity-framework fody-propertychanged

我有一个带有父对象的Node对象,我已经绑定了我的xaml,

<Label>
    <Hyperlink>
        <TextBlock Text="{Binding Path=Node.Parent.Name}"/>
    </Hyperlink>
</Label>

我的ViewModel看起来像这样

public class NodeViewModel
{
    public Node Node { get; set; }

    public NodeViewModel(Node model)
    {
        Node = model;
        if(model.Parent != null) { } // Check if it's null, then do nothing.
        // When the above line is commented out, my label displays nothing.
    }

}

为什么当我的if语句被注释掉时,标签/文本块是空白的?难道我做错了什么?在检查它是否为空之前,我的对象是否存在且不存在?

修改
忘了提一下,我的节点类很简单,并且为Name属性实现了INotifyPropertyChanged

第二次编辑:添加了我的简单Node类。

[ImplementPropertyChanged] // From Fody.PropertyChanged
public class Node
{
    public int? ParentID { get; set; }
    public Node Parent { get; set; }
    public string Name { get; set; }

    public Node Node(Node p = null)
    {
        Parent = p;
    }
}

2 个答案:

答案 0 :(得分:3)

来自评论:

  

实际上。它由实体框架代理。这可能是问题吗?如果是这样,是否有一种不那么强硬的方法来解决这个问题?

如果 问题确实存在于代理中,那么,好吧,不。你会很难用代理/包装器和WPF以及变更通知来实现。

WPF的绑定引擎不适用于代理。完全没有。好吧,也许除非他们写得很好而且很复杂。所以,通常,永远不会。这就是INPC界面如何工作的原因:

void PropertyChanged(object sender, .... args)

WPF跟踪senderBinding.Source。如果绑定的源是一个名为“Z”的对象,即对象“A”的代理,那么由代理“Z”转发到WPF引擎的任何源自“A”的通知都将被丢弃,因为对于WPF,“Z”是源,它与广告发送者“A”不匹配。

我在很长一段时间内都在与这个问题作斗争,我找到的唯一解决方案是让代理翻译 P-Changed事件,以便{{ 1}}是sender=A的替代。如果没有正确编写,这可能会有一些令人讨厌的内存泄漏。这是因为很难将委托“映射”给新的代表并提供适当的处理和两者的GCing。通常情况下,只有使用ie构建自己的代理才有可能。城堡或类似的图书馆。我还没有找到支持Z任何动态代理库 - 开箱即用的替代品。

如果你知道的话 - 请告诉我!

无论如何,要小心术语。我的意思是,代理。对象“Z”,用于包装和修剪或扩展另一个不同的原始对象“A”上的操作。您的案例可能不同。如果你所谓的“代理”是你的类型的动态子类,如果它覆盖你原始类中的任何虚拟方法/属性/事件,那么它是代理我的意思。在这种情况下,'proxy'和原始对象是同一个对象,只是你把它看作A类而实际的类是sender,对于WPF,Z:A匹配{ {1}}。如果我没记错的话,这就是EF经常使用的方式。

因此,我要检查的第一件事是检查谁是真正的罪魁祸首。也许Fody不是EF?尝试删除该魔法Source,尝试在所有类中手动实施INPC 。我的意思是所有。 senderImplementPropertyChanged都有。如果您很懒,可以Node并使用NodeViewModel代替。如果它工作 - 然后开始删除手册INPC并用ie替换它。来自Fody的。当事情开始破裂时,收集所有结果并重新分析。

另外,检查Fody的作用 - 也许它在某些时候提供透明的代理/包装?

编辑:考虑到当你触摸'Fody'ied对象时你的代码开始工作,我开始责备Fody。也许是因为propdp属性目前没有跟踪过Fody?您是否尝试使用DependencyProperty进行标记?这是一个纯粹的猜测,这意味着这个库有一些严重的问题,但它很快,值得尝试。

答案 1 :(得分:0)

我认为您错过了在INPC上实施ViewModel。当你执行UI时,绑定不会更新回Node = node。在property changed setter上举起Node个活动。