绑定到自定义类上的DependencyProperty

时间:2011-12-13 19:30:56

标签: c# wpf

我遇到了与自定义类绑定的问题。 dependencyproperty似乎没有从我的viewmodel获取正确的值。这是我的自定义类:

    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资源中,我有:

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

我的ViewModel中的“Test”是一个可以将Label绑定到没有问题的属性。我在这个实现中做错了吗?

更新:如果我从Freezable而不是DependencyObject继承,这是有效的。我不太清楚为什么,希望somone可以解释这个。

3 个答案:

答案 0 :(得分:3)

Resources中没有上下文,DataResource需要放在UserControl的某个位置,以便它可以继承DataContext以便绑定(除非已定义来源,否则相对于DataContext

(问题在于,DependencyObject甚至没有“真实”DataContext,因为该属性属于FrameworkElement,如果你很幸运,那么有一个人工环境)

答案 1 :(得分:0)

您还可以在代码后面的Dependency属性上使用FrameworkElement.SetBinding方法。然后您不需要为整个页面设置数据上下文(因为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);

答案 2 :(得分:0)

由于内容似乎是 object 类型 - 这让我相信它将用于举办课程 - 问题实际上可能是 “倾听”的深度。如果 Test 的属性发生更改(也就是字符串的更改),您将收到通知。如果 Test 的属性不是从 DependencyObject 继承的对象,并且它的属性发生更改,您将不会收到通知。最后一个场景递归进行。

根据Microsoft Documentation

<块引用>

[...]

详细更改通知:与其他 DependencyObject 对象不同,Freezable 对象在子属性值更改时提供更改通知。

[...]