2010-02-10 30 views
18

Hãy nói rằng tôi có các lớp học đơn giản sau đây:Sử dụng các ràng buộc trong tình trạng 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; } 
} 

Bây giờ tôi có một mạng lưới với một thể hiện của lớp PersonHolder như DataContext, và trong lưới Tôi có một StackPanel đó là ràng buộc để các CurrentPerson của PersonHolder - hiển thị dữ liệu của nó:

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

Vì vậy - cho câu hỏi: Làm thế nào tôi có thể cung cấp cho các StackPanel một nền màu xanh lá cây khi CurrentPersonId khớp với số ActiveId của số PersonHolder (vâng, rất hữu ích, nhưng đây chỉ là một ví dụ cực kỳ đơn giản ..). Suy nghĩ của tôi là đây là một cái gì đó sử dụng một kích hoạt cho, nhưng tôi có thể sử dụng bindings trong giá trị điều kiện kích hoạt của tôi? Nếu vậy tôi có thể làm một cái gì đó như thế này:

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

Nhưng điều này không hiệu quả. Làm sao tôi có thể giải quyết việc này?

Trả lời

35

Bạn không thể sử dụng giá trị ràng buộc trên thuộc tính Giá trị, nhưng bạn có thể thực hiện việc này bằng cách sử dụng MultiBindingIMultiValueConverter. Tôi sẽ xác định số Trigger của mình trong một số Style trong ví dụ: các Window.Resources, mà sẽ cung cấp cho một cái gì đó như thế này:

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

Xem this link cho một ví dụ về MultiBindingIMultiValueConverter. Chúng khá dễ viết.

Các vấn đề liên quan