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