Скажем, у меня есть следующие простые классы:
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; }
}
Теперь у меня есть сетка с экземпляром класса PersonHolder как DataContext
, и в сетке у меня есть a StackPanel
который связывается с CurrentPerson
из PersonHolder
- показ его данных:
<Grid>
<StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
<TextBlock Text="{Binding Id}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</Grid>
Таким образом - к вопросу: Как я могу дать StackPanel
зеленый фон, когда CurrentPerson
имеет Id
соответствие ActiveId
из PersonHolder
(да, очень полезный, но это - просто чрезвычайно упрощенный пример..). Моя мысль - то, что это - что-то, для чего каждый использует триггер, но я могу использовать привязку в своем триггерном значении условия? Раз так я мог сделать что-то вроде этого:
<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>
Но это не работает. Как я могу решить это?
Невозможно использовать привязку к свойству Value, но это можно обойти, используя MultiBinding и IMultiValueConverter . Я бы определил свой триггер
в стиле
, например, Window.Resources, который даст что-то вроде этого:
<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>
См. эту ссылку для примера MultiBinding
и IMultiValueConverter
. Их довольно легко написать.