我有一个带有 DependencyProperty 的 UserControl。我使用数据绑定表达式在主机窗口中设置它的值。但是,它并没有按预期工作。
用户控件的代码隐藏片段:
public class ViewBase : UserControl
{
public static readonly DependencyProperty ViewModelProperty
= DependencyProperty.Register(
"ViewModel", typeof(ViewModelBase), typeof(ViewBase));
public ViewModelBase ViewModel
{
get { return GetValue(ViewModelProperty) as ViewModelBase; }
set
{
SetValue(ViewModelProperty, value);
}
}
}
并从XAML(注意:CasingListView继承自ViewBase):
<CasingEditor:CasingListView x:Name="_casingListView"
ViewModel="{Binding CasingListViewModel}" />
发生的事情没什么。具体来说,永远不会调用 setter,并且属性保持为 null。我知道来源属性CasingListViewModel
有一个值,因为我尝试将它绑定到另一个属性(DataContext),并且它工作得很好。
我认为依赖属性可以是数据绑定的。我错了吗?
有时,问题并不完全是我们想象的那样。
我提到过二传手从未被调用过。那是真实的。上面的代码稍作修改,使其更加清晰。不幸的是,我还在调用 SetValue 之后删除了 setter 中的一条语句。该语句将值分配给 DataContext,如下所示:
public ViewModelBase ViewModel
{
get { return GetValue(ViewModelProperty) as ViewModelBase; }
set
{
SetValue(ViewModelProperty, value);
DataContext = value;
}
}
正如我现在所了解到的这篇优秀的文章 http://www.switchonthecode.com/tutorials/wpf-tutorial-introduction-to-dependency-properties, the setter 实际上被绕过了当通过数据绑定设置属性时。该框架直接针对 DependencyObject 工作。因此,属性实际上已设置,但设置器从未被调用(正如我提到的),结果是 DataContext 仍然为 null 并且没有任何作用。
所以:首先,我为提出一个无法回答的问题深表歉意。其次,作为弥补,我可以传达一个非常重要的建议:
切勿在属性 getter/setter 中放置除 GetValue() 和 SetValue() 之外的任何内容,因为它们并不总是被调用!
Edit:后来我还发现了这个方法的另一个问题。通过这种方式设置 DataContext,我实际上失去了最初支持绑定的原始数据上下文。结果是该属性立即重置为 null。总而言之,这不是一个好的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)