2010-02-10 11 views
18

चलो कहते हैं कि मैं निम्नलिखित सरल कक्षाओं करते हैं:का उपयोग बाइंडिंग

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

अब मैं DataContext के रूप में वर्ग PersonHolder का एक उदाहरण के साथ एक ग्रिड है, और ग्रिड में मैं एक StackPanel जो करने के लिए बाध्य कर रहा है PersonHolder की CurrentPerson - अपने डेटा दिखाने:

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

तो - सवाल का: मैं कैसे StackPanel एक हरे रंग की पृष्ठभूमि दे सकते हैं जब CurrentPerson एकहै(हाँ) ActiveId से मेल खाता है, बहुत उपयोगी है, लेकिन यह एक बेहद सरल उदाहरण है ..)। मेरा विचार यह है कि यह एक ट्रिगर का उपयोग करता है, लेकिन क्या मैं अपने ट्रिगर स्थिति मूल्य में बाइंडिंग का उपयोग कर सकता हूं? यदि ऐसा है तो मैं ऐसा कुछ कर सकता हूं:

<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

आप वैल्यू प्रॉपर्टी पर बाइंडिंग का उपयोग नहीं कर सकते हैं, लेकिन आप MultiBinding और IMultiValueConverter का उपयोग करके इसे प्राप्त कर सकते हैं। मैं 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> 

MultiBinding और IMultiValueConverter पर एक उदाहरण के लिए this link देखें। वे लिखने के लिए काफी आसान हैं।

संबंधित मुद्दे