2011-12-13 118 views
4

我遇到了绑定到自定义类的问题。依赖属性似乎没有从我的viewmodel获得正确的值。这里是我的自定义类:绑定到自定义类上的DependencyProperty

public class DataResource : DependencyObject 
     { 

      public static readonly DependencyProperty ContentProperty = 
       DependencyProperty.Register("Content", 
        typeof(object), 
        typeof(DataResource)); 

      public object Content 
      { 
       get { return (object)GetValue(ContentProperty); } 
       set { SetValue(ContentProperty, value); } 
      } 

     } 

而且在我的用户资源,我有:

<UserControl.Resources> 
     <local:DataResource x:Key="dataResource" Content="{Binding Test}"></data:DataResource> 
    </UserControl.Resources> 

“测试”在我的视图模型是,我可以一个标签绑定到没有问题的属性。在这个实现中,我在这里做错了什么?

更新:如果我从Freezable而不是DependencyObject继承,则可以使用此方法。我不太清楚为什么,希望somone能解释这一点。

回答

3

有一个在Resources没有上下文中,DataResource将需要某处UserControl放置,因此它可以继承DataContext使得结合(除非源被定义,其是相对于DataContext)就完成了。

(与一个问题是DependencyObject甚至没有一个“真正的” DataContext作为财产属于FrameworkElement,如果你是幸运的还有,虽然人工上下文)

+0

如果我改变我的DataResource类从FrameworkElement的延长,我没有背景还是?我可以在我的资源中使用CollectionViewSource,并且绑定工作正常,因为我的UserControl已经有DataContext集。 – dbomb7 2011-12-14 14:36:33

+0

也许这是通过[继承上下文](http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx)工作,但我不确定。但将类型更改为`FrameworkElement`确实不是采取任何方式的正确步骤,在您真正无法绑定到当前DataContext时,应考虑使用另一个源,例如`ElementName`或`Source`并指定路径相对于该来源。 – 2011-12-14 15:07:45

0

您也可以使用FrameworkElement的.SetBinding方法放在代码后面的Dependency Property中。那么你不需要为整个页面设置数据上下文(因为DataContext和DP不能很好地混合)。

这里是MSDN上: http://msdn.microsoft.com/en-us/library/ms598273.aspx

样品:

MyData myDataObject = new MyData(DateTime.Now);  
Binding myBinding = new Binding("MyDataProperty"); 
myBinding.Source = myDataObject; 
myText.SetBinding(TextBlock.TextProperty, myBinding); 
相关问题