2011-05-05 7 views
11

<UserControl.Resources> में शैली की स्थापनाअंक शैली में MultiBinding कनवर्टर और उत्प्रेरक मिश्रण

<Style x:Key="FieldToValidate" TargetType="{x:Type TextBox}"> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <MultiBinding Converter="{StaticResource VisualQueueOnErrorConverter}"> 
       <Binding RelativeSource="{RelativeSource self}" Path="Name" /> 
       <Binding RelativeSource="{RelativeSource AncestorType={x:Type DockPanel}}" Path="DataContext.ErrorFieldName" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" /> 
      </MultiBinding> 
     </Setter.Value> 
    </Setter> 

    <Style.Triggers> 
     <Trigger Property="Background" Value="Red"> 
      <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource self}}" /> 
      <Setter Property="Foreground" Value="White" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

और नियंत्रण (कनवर्टर संभालने रंग लाल रिटर्न):

<TextBox Name="FirstName" Text="{Binding FirstName}" Style="{StaticResource FieldToValidate}"> 

अपेक्षित परिणाम के लिए है फोकस प्राप्त करने के लिए फ़ील्ड FirstName और मल्टीबाइंडिंग कनवर्टर लाल रंग में पृष्ठभूमि रंग बदलता है, जबकि फ़ील्ड की पृष्ठभूमि लाल रंग में बदल जाती है, लेकिन इसे फोकस और न ही नया अग्रभूमि रंग मिलता है।

ऐसा लगता है कि एक्सएएमएल पार्सर से पहले संपत्ति सेटटर के मल्टीबाइंडिंग कनवर्टर से पहले ट्रिगर को संसाधित करता है।

कोई भी और सभी सुझाव आपका स्वागत है!

उत्तर

22

मुझे लगता है कि Red ट्रिगर में निर्दिष्ट ब्रश और Red कनवर्टर द्वारा लौटा ब्रश बराबर नहीं माना जाता है (क्योंकि वे अलग-अलग उदाहरण हैं), इसलिए ट्रिगर कभी निष्पादित नहीं होता है। वैसे भी, कुछ रंग ट्रिगर करने के लिए पृष्ठभूमि रंग पर भरोसा करना बहुत अच्छा विचार नहीं लगता है ...

आपको अपना कनवर्टर बदलना चाहिए ताकि त्रुटि होने पर यह सच हो जाए और इसे निम्नानुसार उपयोग करें:

<Style x:Key="FieldToValidate" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <DataTrigger Value="True"> 
      <DataTrigger.Binding> 
       <MultiBinding Converter="{StaticResource VisualQueueOnErrorConverter}"> 
        <Binding RelativeSource="{RelativeSource self}" Path="Name" /> 
        <Binding RelativeSource="{RelativeSource AncestorType={x:Type DockPanel}}" Path="DataContext.ErrorFieldName" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" /> 
       </MultiBinding> 
      </DataTrigger.Binding> 
      <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource self}}" /> 
      <Setter Property="Background" Value="Red" /> 
      <Setter Property="Foreground" Value="White" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

इसके अलावा, आपके कनवर्टर के नाम पर, तो आप शायद मतलब था "दृश्य क्यू", नहीं "कतार";)

+0

मैं एक सुंदर तरीका ट्रिगर गठबंधन करने के लिए और की तलाश कर रहा था मल्टीबाइंडिंग लेकिन कुछ भी नहीं मिला इसलिए मैंने रंग-आधारित ट्रिगर का सहारा लिया ... जब तक आप नहीं आए साथ! मैंने अभी आपके समाधान का परीक्षण किया और यह बहुत अच्छा काम करता है! मैंने "क्यू" के साथ "क्यूई" को बदलने के साथ परीक्षण नहीं किया है, लेकिन मुझे पूरा यकीन है कि यह काम करेगा ...;) Merci। – BlazingFrog

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