2010-02-10 28 views
18

比方說,我有以下簡單的類:在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; } 
} 

現在我有類PersonH​​older的實例作爲DataContext一個網格,在網格中我有一個綁定到一個StackPanelPersonHolderCurrentPerson - 顯示其數據:

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

所以 - 這個問題:我如何給StackPanel綠色背景時CurrentPersonId匹配PersonHolderActiveId是啊,非常有用,但這只是一個非常簡化的例子。))。我的想法是,這是一個使用觸發器的東西,但我可以在我的觸發條件值中使用綁定嗎?如果是這樣,我可以做這樣的事情:

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

但這不起作用。我該如何解決這個問題?

回答

35

您無法在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。他們寫起來相當容易。