with trigger .net wpf data-binding datatrigger

.net - with - Uso de enlaces en la condición DataTrigger



trigger with condition wpf (1)

Digamos que tengo las siguientes clases simples:

public class Person { public int Id { get; set; } public string Name { get; set; } } public class PersonHolder { public Person CurrentPerson { get; set; } public int ActiveId { get; set; } }

Ahora tengo una cuadrícula con una instancia de la clase PersonHolder como DataContext , y en la cuadrícula tengo un StackPanel que está vinculado a la CurrentPerson de PersonHolder - mostrando sus datos:

<Grid> <StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}"> <TextBlock Text="{Binding Id}" /> <TextBlock Text="{Binding Name}" /> </StackPanel> </Grid>

Entonces, a la pregunta: ¿Cómo puedo darle al StackPanel un fondo verde cuando el CurrentPerson tiene una Id coincide con el ActiveId del PersonHolder ( sí, muy útil, pero esto es solo un ejemplo extremadamente simplificado ... ) Mi idea es que esto es algo para lo que uno usa un activador, pero ¿puedo usar enlaces en mi valor de condición de activador? Si es así podría hacer algo como esto:

<Grid x:Name="Foo"> <StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}"> <TextBlock Text="{Binding Id}" /> <TextBlock Text="{Binding Name}" /> <StackPanel.Triggers> <DataTrigger Binding="{Binding Id}" Value="{Binding ElementName=Foo, Path=ActiveId}"> <Setter TargetName="PersonPanel" Property="Background" Value="Green" /> </DataTrigger> </StackPanel.Triggers> </StackPanel> </Grid>

Pero esto no funciona. ¿Como puedo resolver esto?


No puede utilizar un enlace en la propiedad Valor, pero puede MultiBinding esto utilizando un MultiBinding y un IMultiValueConverter . Definiría mi Trigger en un Style en, por ejemplo, los recursos de Window.Resources, que darían algo como esto:

<Window.Resources> <local:SomeMultiConverter x:Key="someMultiConverter" /> <Style x:Key="someStyle" TargetType="StackPanel"> <Setter Property="StackPanel.Background" Value="Red" /> <Style.Triggers> <DataTrigger Value="True"> <DataTrigger.Binding> <MultiBinding Converter="{StaticResource someMultiConverter}"> <Binding Path="Id"></Binding> <Binding ElementName="Foo" Path="DataContext.ActiveId"></Binding> </MultiBinding> </DataTrigger.Binding> <Setter Property="StackPanel.Background" Value="Green" /> </DataTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid x:Name="Foo"> <StackPanel DataContext="{Binding CurrentPerson}" Style="{StaticResource someStyle}" > <TextBlock Text="{Binding Id}" /> <TextBlock Text="{Binding Name}" /> </StackPanel> </Grid>

Vea este enlace para un ejemplo en MultiBinding e IMultiValueConverter . Son bastante fáciles de escribir.