如何在控件的资源标记中设置DataContext?

时间:2017-11-09 15:06:30

标签: wpf binding datacontext

我有一个UserControl,我的DataContext被定义为我的标签中的属性。在UserControl的资源之外的任何地方,我都可以绑定到DataContext中的属性。但是,当我尝试在我的控件的资源中执行此操作时,遇到以下情况:System.InvalidOperationException:'Binding'必须具有非null值。

我怀疑这是因为我没有在范围内使用DataContext(Resource标签)我试图使用它,不仅因为Binding为null,而且因为我试图绑定到的属性在坠机前也永远不会被召唤。我的问题是:如何在此特定范围内绑定到DataContext中的属性?我已经尝试了一些事情,例如给UserControl一个x:Name并尝试设置Source = {x:引用the_x:Name},但无济于事。

下面,B和C是我的DataContext中具有上述问题的属性。 A很好,因为这只是我的Style的TargetType的属性。

<UserControl... (DataContext defined here)>
  <UserControl.Resources...>
    <Style...>
      <Style.Triggers>
        <MultiDataTrigger>
          <MultiDataTrigger.Conditions>
            <Condition Property="A" Value="D"/>
              <Condition>
                <Condition.Binding>
                  <MultiBinding Converter="{StaticResource SomeIMultiValueConverter}">
                    <Binding Path="B"/>
                    <Binding Path="C"/>
                  </MultiBinding>
                </Condition.Binding>
            <Condition.Value>
              <sys:Boolean>False</sys:Boolean>
            </Condition.Value>

1 个答案:

答案 0 :(得分:0)

在Style中,任何绑定的默认Source将是样式目标的DataContext,而不是XAML文件中最外层元素的源,或者是Resources的所有者。例如,如果您将一个样式应用于Button,那么它将是Button的DataContext

但是,这不会导致此异常。带有null或错误源的绑定不是绑定的空引用。

此代码重现您的异常。问题是,在MultiDataTrigger中使用时,Condition必须有Binding

<TextBlock>
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <!-- TextBlock has no property named A, so I'll use Text -->
                        <Condition Property="Text" Value="D"/>
                    </MultiDataTrigger.Conditions>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

如果您希望在样式目标的多个常规属性上使用MultiTrigger,请使用MultiTrigger

如果A是视图模型的属性而不是控件的属性,则无论如何都不需要Property="A";你想要Binding="{Binding A}"

<Condition Binding="{Binding A}" Value="D"/>

如果A是UserControl的属性,则需要Binding="{Binding A, RelativeSource={RelativeSource AncestorType=UserControl}}"

<Condition 
    Binding="{Binding A, RelativeSource={RelativeSource AncestorType=UserControl}}"
    Value="D"
    />