trigger example data .net wpf data-binding triggers

.net - example - Usar el enlace para la propiedad Value de la condición DataTrigger



wpf button triggers (2)

Estoy trabajando en una aplicación WPF y estoy luchando con un disparador de datos. Me gustaría vincular el valor de la condición de activación a algún objeto que tengo:

<DataTrigger Binding="{Binding Foo}" Value="{Binding ElementName=AnotherElement, Path=Bar}">..

Sin embargo, no estoy autorizado ya que no parece posible usar enlaces para la propiedad Value. ¿Lo es? ¿Puedo lograr esto de alguna manera? Obtuve el siguiente error:

No se puede establecer un ''Enlace'' en la propiedad ''Valor'' de tipo ''DataTrigger''. Un ''Enlace'' solo se puede establecer en una DependencyProperty de un DependencyObject.


Aquí hay un ejemplo con el convertidor IMultiValueConverter .

En este XAML hay tres casillas de verificación. Los primeros dos están vinculados a las propiedades Foo y Bar (ambos son booleanos). El tercero usa enlace múltiple con IMultiValueConverter. Se comprueba cuando Foo y Bar tienen los mismos valores.

<!-- 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>

IMultiValueConverter simple de IMultiValueConverter para el enlace de una vía:

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(); } }


No, no es posible. Como dice el mensaje de error, solo las propiedades de dependencia pueden ser objetivos de enlaces WPF y DataTrigger.Value no es una propiedad de dependencia. Por lo tanto, deberá asignar un valor real.

La solución consiste en utilizar un enlace múltiple cuyas vinculaciones secundarias son las dos vinculaciones que desea comparar, con un convertidor de valor múltiple que devuelve verdadero si las dos entradas son iguales y falsas si son desiguales. El DataTrigger puede usar ese MultiBinding y un Value of True.