sti*_*k81 25 .net data-binding wpf triggers
我正在研究WPF应用程序并且正在努力处理数据触发器.我想将触发条件的值绑定到我拥有的某个对象:
<DataTrigger Binding="{Binding Foo}"
Value="{Binding ElementName=AnotherElement, Path=Bar}">..
Run Code Online (Sandbox Code Playgroud)
但是,我不被允许,因为似乎不可能为Value属性使用绑定.是吗?我能以某种方式实现吗?我收到以下错误:
无法在"DataTrigger"类型的"Value"属性上设置"绑定".'绑定'只能在DependencyObject的DependencyProperty上设置.
ito*_*son 37
不,这是不可能的.正如错误消息所述,只有依赖项属性可以是WPF绑定的目标,而DataTrigger.Value不是依赖项属性.所以你需要分配一个实际值.
解决方法是使用MultiBinding,其子Bindings是您要比较的两个绑定,IMultiValueConverter如果两个输入相等则返回true,如果它们不相等则返回false.然后,DataTrigger可以使用该MultiBinding,并使用Value of True.
这是IMultiValueConverter转换器的示例。
<!-- It's expected that the DataContext of this StackPanel has boolean Bar and Foo properties.. -->
<StackPanel Orientation="Vertical">
<StackPanel.Resources>
<!-- local contains the MultiValueEqualityConverter class implementation -->
<local:MultiValueEqualityConverter x:Key="multiValueEqualityConverter"/>
</StackPanel.Resources>
<CheckBox IsChecked="{Binding Foo}">Foo</CheckBox>
<CheckBox IsChecked="{Binding Bar}">Bar</CheckBox>
<CheckBox IsEnabled="False" Content="Are the same">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Setters>
<Setter Property="IsChecked" Value="False"/>
</Style.Setters>
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource multiValueEqualityConverter}">
<Binding RelativeSource="{RelativeSource self}" Path="DataContext.Foo" Mode="OneWay" />
<Binding RelativeSource="{RelativeSource self}" Path="DataContext.Bar" Mode="OneWay"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="IsChecked" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
IMultiValueConverter单向绑定的简单实现:
public class MultiValueEqualityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values?.All(o => o?.Equals(values[0]) == true) == true || values?.All(o => o == null) == true;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19940 次 |
| 最近记录: |