用户控件的DataContext如何与其依赖属性相关?

时间:2015-01-22 09:22:13

标签: wpf dependency-properties datacontext

在使用具有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专业版有一个简短的解释? 谢谢! 乌利

2 个答案:

答案 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 ......