代码之家  ›  专栏  ›  技术社区  ›  Tor Haugen

无法数据绑定DependencyProperty

  •  4
  • Tor Haugen  · 技术社区  · 15 年前

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

    来自用户控件代码隐藏的代码段:

    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,并且属性保持为空。我知道源属性 CasingListViewModel 有一个值,因为我尝试将它绑定到另一个属性(DataContext),但它工作正常。

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

    1 回复  |  直到 13 年前
        1
  •  6
  •   Tor Haugen    15 年前

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

    我说过,从来没有叫过二传手。那是真的。上面的代码经过了微调,使其更清晰。不幸的是,在调用setValue之后,我还删除了setter中的一条语句。该语句将值赋给DataContext,如下所示:

    public ViewModelBase ViewModel
    {
        get { return GetValue(ViewModelProperty) as ViewModelBase; }
        set
        {
            SetValue(ViewModelProperty, value);
            DataContext = value;
        }
    }
    

    正如我现在所学到的 this excellent article , the 实际上绕过了setter 当通过数据绑定设置属性时。相反,框架直接针对DependencyObject工作。因此,实际上设置了属性,但从未调用setter(如我所提到的),其结果是DataContext保持为空,不起作用。

    所以:首先,我为问一个无法回答的问题深表歉意。第二,作为弥补的一种方式,我可以传递非常重要的建议:

    不要将getValue()和setValue()以外的任何东西放在getter/setter属性中,因为它们并不总是被调用!

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