2009-10-14 156 views
4

我有一个带有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),并且它工作正常。

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

+1

出于兴趣,为什么不绑定到DataContext? – 2009-10-14 14:20:50

+0

好问题!其实,我们可能可以。但是有一些代码已经期望ViewModel属性被设置。另外,我们在其他用户控件中遇到了与其他属性相同的问题,并想了解如何使其工作。 – 2009-10-14 14:25:46

+0

CasingListViewModel如何声明?它是Window的资源还是属性? – 2009-10-14 14:34:20

回答

6

正如有时候发生的那样,问题结果并不完全如我们所想。

我刚才提到过,setter从未被调用过。那是真实的。上面的代码稍微修剪以使其更清晰。不幸的是,在调用SetValue之后,我还修改了setter中的语句。这种说法分配价值的DataContext,这样的事情:

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

正如我现在已经从this excellent article了解到,二传手,其实是在绕过当属性通过数据绑定设置。该框架直接针对DependencyObject。所以这个属性实际上是设置的,但是setter从来没有被调用过(正如我所提到的),结果是DataContext保持为null并且没有任何工作。

所以:首先,我非常抱歉地问一个无法回答的问题。其次,弥补了它的一种方式,我可以通过对意见的非常重要的一块:

不要把任何东西,但的GetValue()和的SetValue()属性的getter/setter里面,因为他们不总是叫!

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

+0

将此标记为已回答 – 2009-10-15 02:57:10

+0

我会,但我不允许 - 尚有2天的延迟来接受您自己的答案。 – 2009-10-16 08:16:51