Используя привязку в условии DataTrigger

Скажем, у меня есть следующие простые классы:

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>

Но это не работает. Как я могу решить это?

18
задан slugster 27 October 2011 в 01:13
поделиться

1 ответ

Невозможно использовать привязку к свойству 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 . Их довольно легко написать.

35
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: