我有一个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>
答案 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"
/>