我有一个带有父对象的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;
}
}
答案 0 :(得分:3)
来自评论:
实际上。它由实体框架代理。这可能是问题吗?如果是这样,是否有一种不那么强硬的方法来解决这个问题?
如果 问题确实存在于代理中,那么,好吧,不。你会很难用代理/包装器和WPF以及变更通知来实现。
WPF的绑定引擎不适用于代理。完全没有。好吧,也许除非他们写得很好而且很复杂。所以,通常,永远不会。这就是INPC界面如何工作的原因:
void PropertyChanged(object sender, .... args)
WPF跟踪sender
和Binding.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 。我的意思是所有。 sender
和ImplementPropertyChanged
都有。如果您很懒,可以Node
并使用NodeViewModel
代替。如果它工作 - 然后开始删除手册INPC并用ie替换它。来自Fody的。当事情开始破裂时,收集所有结果并重新分析。
另外,检查Fody的作用 - 也许它在某些时候提供透明的代理/包装?
编辑:考虑到当你触摸'Fody'ied对象时你的代码开始工作,我开始责备Fody。也许是因为propdp
属性目前没有跟踪过Fody?您是否尝试使用DependencyProperty
进行标记?这是一个纯粹的猜测,这意味着这个库有一些严重的问题,但它很快,值得尝试。
答案 1 :(得分:0)
我认为您错过了在INPC
上实施ViewModel
。当你执行UI
时,绑定不会更新回Node = node
。在property changed
setter上举起Node
个活动。