在DataTrigger条件中使用绑定

sti*_*k81 18 .net data-binding wpf 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; }
}
Run Code Online (Sandbox Code Playgroud)

现在我有类PersonH​​older的实例为栅格DataContext,和在网格我有一个StackPanel被绑定到CurrentPersonPersonHolder-表示它的数据:

<Grid>
    <StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
        <TextBlock Text="{Binding Id}" />
        <TextBlock Text="{Binding Name}" />            
    </StackPanel>        
</Grid>
Run Code Online (Sandbox Code Playgroud)

所以-这个问题:我如何给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>
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我怎么解决这个问题?

cod*_*oop 35

您不能在Value属性上使用绑定,但可以使用MultiBindingIMul​​tiValueConverter来解决这个问题.我会Trigger在一个Style例如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>
Run Code Online (Sandbox Code Playgroud)

有关和的示例,请参阅此链接.他们写起来相当容易.MultiBindingIMultiValueConverter