【问题标题】:Cannot databind DependencyProperty无法对 DependencyProperty 进行数据绑定
【发布时间】:2009-10-14 14:06:40
【问题描述】:

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

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

【问题讨论】:

  • 出于兴趣,为什么不绑定到DataContext?
  • 好问题!实际上,我们可能可以。但是已经有一些代码需要设置 ViewModel 属性。此外,我们在其他用户控件中的其他属性也遇到了同样的问题,并且想了解如何使其工作。
  • CasingListViewModel 如何/在哪里声明?它是 Window 的资源还是属性?

标签: wpf data-binding dependency-properties


【解决方案1】:

正如有时发生的那样,问题与我们想象的不完全一样。

我提到过 setter 从未被调用过。那是真实的。上面的代码被略微修剪以使其更清晰。不幸的是,在调用 SetValue 之后,我还删除了 setter 中的一个语句。该语句将值分配给 DataContext,如下所示:

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

正如我现在从this excellent article 了解到的,当通过数据绑定设置属性时,setter 实际上被绕过。相反,该框架直接针对 DependencyObject 工作。所以实际上设置了属性,但从未调用过 setter(正如我所提到的),结果是 DataContext 保持为空,没有任何效果。

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

除了 GetValue() 和 SetValue() 之外,不要在属性 getter/setter 中放置任何东西,因为它们并不总是被调用!

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

【讨论】:

  • 我会,但我还不允许 - 接受您自己的答案有 2 天的延迟。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2016-02-29
  • 2013-05-01
  • 2021-11-08
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多