我遇到了与自定义类绑定的问题。 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可以解释这个。
答案 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
继承的对象,并且它的属性发生更改,您将不会收到通知。最后一个场景递归进行。
[...]
详细更改通知:与其他 DependencyObject
对象不同,Freezable
对象在子属性值更改时提供更改通知。
[...]