在使用具有DependencyProperties的UserControl时,我意识到考虑在哪里设置DataContext是很重要的。为了想象,我已经创建了一个示例应用程序。有两个UserControl,除了DataContext的设置位置之外都是相同的:
Working UserControl:
<UserControl x:Class="DpropTest.OkUserControl"
...>
<Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=dpropTest:OkUserControl }}">
<TextBlock Text="{Binding Path=MyDepProp}"></TextBlock>
</Grid>
</UserControl>
不能正常使用用户控件:
<UserControl x:Class="DpropTest.NotOkUserControl"
...
DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=dpropTest:NotOkUserControl}}"
>
<Grid >
<TextBlock Text="{Binding Path=MyDepProp}"></TextBlock>
</Grid>
两个UserControl都有一个名为MyDepProp的DependencyProperty,
#region Dependency Property Declaration
public static readonly DependencyProperty MyDepPropProperty = DependencyProperty.Register(
"MyDepProp", typeof(string), typeof(NotOkUserControl), new PropertyMetadata(default(string)));
public string MyDepProp
{
get { return (string)GetValue(MyDepPropProperty); }
set { SetValue(MyDepPropProperty, value); }
}
#endregion Dependency Property Declaration
这就是我将UserControls集成到mainWindow的方式:
<Grid x:Name="ParentGrid">
<StackPanel>
<dpropTest:OkUserControl MyDepProp="{Binding Path=ActualWidth, ElementName=ParentGrid}"/>
<dpropTest:NotOkUserControl MyDepProp="{Binding Path=ActualWidth, ElementName=ParentGrid}"/>
</StackPanel>
</Grid>
正在运行的应用程序仅显示第一个UserControlonly的actualWith,第二个UserControl保持未设置,因为DP没有绑定。
输出窗口中没有关于第二个UserControl的错误...
也许有一个WPF专业版有一个简短的解释? 谢谢! 乌利
答案 0 :(得分:1)
我不认为FindAncestor会从元素本身开始,但除此之外:你可以在UserControl上设置它:
DataContext="{Binding RelativeSource={RelativeSource Self}}"
或在InitializeComponent:
之前在用户控件的构造函数中设置它DataContext = this;
作为旁注:通常不需要与某些祖先的ActualWidth绑定;在这种情况下,stackpanel的宽度与其父网格的宽度相同,并且usercontrols的宽度与该stackpanel的宽度相同。所以实际上MyDepProp等于usercontrol的ActualWidth。
答案 1 :(得分:0)
<UserControl x:Class="DpropTest.NotOkUserControl"
...
DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=dpropTest:OkUserControl }}"
对我来说,你是绑定到错误的父母!你在NotOkUserControl里面,但是你要求无法访问的AncestorType ......