【问题标题】:Using bindings in DataTrigger condition在 DataTrigger 条件下使用绑定
【发布时间】:2011-01-15 10:33:07
【问题描述】:

假设我有以下简单的类:

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

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

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

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

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

但这不起作用。我该如何解决这个问题?

【问题讨论】:

    标签: .net wpf data-binding datatrigger


    【解决方案1】:

    您不能对 Value 属性使用绑定,但可以通过使用 MultiBindingIMultiValueConverter 来解决这个问题。我会在 Style 中定义我的 Trigger,例如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>
    

    有关MultiBindingIMultiValueConverter 的示例,请参见this link。它们相当容易编写。

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 2017-02-16
      • 2017-08-09
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2013-06-25
      相关资源
      最近更新 更多