Wpf 无法数据绑定DependencyProperty

Wpf 无法数据绑定DependencyProperty,wpf,data-binding,dependency-properties,Wpf,Data Binding,Dependency Properties,我有一个具有DependencyProperty的UserControl。我使用数据绑定表达式在主机窗口中设置它的值。然而,它并没有像预期的那样工作 来自用户控件的codebehind的代码段: public class ViewBase : UserControl { public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register(

我有一个具有DependencyProperty的UserControl。我使用数据绑定表达式在主机窗口中设置它的值。然而,它并没有像预期的那样工作

来自用户控件的codebehind的代码段:

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):


所发生的一切都无关紧要。具体来说,永远不会调用setter,并且属性保持为null。我知道源属性CasingListViewModel有一个值,因为我尝试将它绑定到另一个属性(DataContext),它工作得很好


我认为依赖属性可以被数据绑定。我错了吗?

正如有时发生的那样,问题并不是我们所想的那样

我提到塞特从未被叫来过。这是真的。上面的代码稍加修改以使其更清晰。不幸的是,在调用SetValue之后,我还删除了setter中的一条语句。该语句将值分配给DataContext,如下所示:

public ViewModelBase ViewModel
{
    get { return GetValue(ViewModelProperty) as ViewModelBase; }
    set
    {
        SetValue(ViewModelProperty, value);
        DataContext = value;
    }
}
正如我现在从中了解到的,当通过数据绑定设置属性时,setter实际上被绕过。相反,框架直接针对DependencyObject工作。因此,实际上设置了属性,但从未调用setter(正如我所提到的),结果是DataContext仍然为null,没有任何功能

所以:首先,我为问了一个无法回答的问题而深表歉意。其次,作为一种弥补,我可以提出一条非常重要的建议:

永远不要将GetValue()和SetValue()以外的任何内容放在属性getter/setter中,因为它们并不总是被调用


编辑:稍后,我还发现了这种方法的另一个问题。通过这样设置DataContext,我实际上丢失了最初支持绑定的原始数据上下文。结果是该属性立即重置为null。总的来说,这不是一个好方法。

出于兴趣,为什么不绑定到DataContext?好问题!事实上,我们也许可以。但是已经有一些代码要求设置ViewModel属性。此外,我们在其他用户控件中的其他属性也遇到了同样的问题,希望了解如何使其工作。CasingListViewModel是如何声明的/在哪里声明的?这是窗口的资源还是财产?我会的,但我还不允许——接受你自己的答案要延迟两天。
public ViewModelBase ViewModel
{
    get { return GetValue(ViewModelProperty) as ViewModelBase; }
    set
    {
        SetValue(ViewModelProperty, value);
        DataContext = value;
    }
}