本文介绍了在DataTrigger条件下使用绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有以下简单的类:

  public class Person 
{
public int Id {get;组; }
public string Name {get;组; }
}

public class PersonH​​older
{
public Person CurrentPerson {get;组; }
public int ActiveId {get;组; }
}

现在我有一个网格,一个PersonH​​older类的实例为 DataContext ,而在网格中,我有一个 StackPanel 绑定到 CurrentPerson of PersonH​​older - 显示其数据:

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

所以 - 问题:如何给 StackPanel 绿色背景当 CurrentPerson 有一个 Id 匹配 ActiveId PersonH​​older (是非常有用的,但这只是一个非常简单的例子.. )。我的想法是,这是一个使用触发器的东西,但是可以在触发条件值中使用绑定吗?如果是这样,我可以这样做:

 < Grid x:Name =Foo> 
< StackPanel x:Name =PersonPanelDataContext ={Binding CurrentPerson}>
< TextBlock Text ={Binding Id}/>
< TextBlock Text ={Binding Name}/>
< StackPanel.Triggers>
< DataTrigger Binding ={Binding Id}Value ={Binding ElementName = Foo,Path = ActiveId}>
< Setter TargetName =PersonPanelProperty =BackgroundValue =Green/>
< / DataTrigger>
< /StackPanel.Triggers>
< / StackPanel>
< / Grid>

但这不行。我如何解决这个问题?

解决方案

您不能对Value属性使用绑定,但可以通过使用和一个。我将在 Style 中定义我的触发器。 Window.Resources将会提供如下的东西:

 < Window.Resources> 
< local:SomeMultiConverter x:Key =someMultiConverter/>
< Style x:Key =someStyleTargetType =StackPanel>
< Setter Property =StackPanel.BackgroundValue =Red/>
< Style.Triggers>
< DataTrigger Value =True>
< DataTrigger.Binding>
< MultiBinding Converter ={StaticResource someMultiConverter}>
< Binding Path =Id>< / Binding>
< Binding ElementName =FooPath =DataContext.ActiveId>< / Binding>
< / MultiBinding>
< /DataTrigger.Binding>
< Setter Property =StackPanel.BackgroundValue =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 。他们很容易写。


Let's say I have the following simple classes:

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; }
}

Now I have a grid with an instance of class PersonHolder as DataContext, and in the grid I have a StackPanel which is bound to the CurrentPerson of PersonHolder - showing its data:

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

So - to the question: How can I give the StackPanel a green background when the CurrentPerson has an Id matching the ActiveId of the PersonHolder (yeah, very useful, but this is just an extremely simplified example..). My thought is that this is something one uses a trigger for, but can I use bindings in my trigger condition value? If so I could do something like this:

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

But this doesn't work. How can I solve this?

解决方案

You can't use a binding on the Value property, but you can get around this by using a MultiBinding and an IMultiValueConverter. I would define my Trigger in a Style in e.g. the Window.Resources, which would give something like this:

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

See this link for an example on MultiBinding and IMultiValueConverter. They're fairly easy to write.

这篇关于在DataTrigger条件下使用绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 15:51