WPF में डेटा ट्रिगर के लिए मैं कई शर्तें कैसे प्रदान कर सकता हूं?


जवाबों:


280

MultiDataTrigger प्रकार का उपयोग करें

<Style TargetType="ListBoxItem">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Path=State}" Value="WA">
        <Setter Property="Foreground" Value="Red" />
      </DataTrigger>    
      <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
          <Condition Binding="{Binding Path=Name}" Value="Portland" />
          <Condition Binding="{Binding Path=State}" Value="OR" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Background" Value="Cyan" />
      </MultiDataTrigger>
    </Style.Triggers>
  </Style>

28
क्या मल्टीट्रैगर में "ओआर" स्टेटमेंट करने का कोई तरीका है। उदाहरण के लिए नाम = "पोर्टलैंड" या राज्य = "ओआर"
जसोन्क

12
@ अंजोंक - यकीन नहीं तो आप मल्टीट्रैगर से कर सकते हैं। आप इसके लिए दो ट्रिगर परिभाषित कर सकते हैं ..
गिशु

2
यदि यह एक साधारण या स्थिति कथन है, तो आप तर्क को उल्टा कर सकते हैं इसलिए यह AND में बदल जाता है। | कंडीशन १ | कंडीशन २ | परिणाम | | सच | सच | सच | | सच | गलत | सच | | झूठी | सच | सच | | झूठी | झूठी | झूठा | या तो / या सत्य के लिए जाँच करने के बजाय, जांचें कि दोनों / और झूठे हैं, और डिफ़ॉल्ट को सही पर सेट करें।
वीसम अब्दुल्ला

3
@WeSamAbdallah आप स्थितियों के झूठे होने की जाँच नहीं कर सकते।
जिम बाल्टर

4
आप एक साधारण कनवर्टर द्वारा झूठी होने की स्थिति की जांच कर सकते हैं।
पॉल

50

@ अंजोंक - यदि आप "या" चाहते हैं, तो (ए और बी) के बाद से सभी शर्तों को नकारें <=> ~ (~ ए (~ ए / बी))

लेकिन अगर आपके पास बूलियन के अलावा अन्य प्रकार हैं जो कन्वर्टर्स का उपयोग करते हैं:

<MultiDataTrigger.Conditions>
    <Condition Value="True">
        <Condition.Binding>
            <MultiBinding Converter="{StaticResource conditionConverter}">
                <Binding Path="Name" />
                <Binding Path="State" />
            </MultiBinding>
        </Condition.Binding>
        <Setter Property="Background" Value="Cyan" />
    </Condition>
</MultiDataTrigger.Conditions>

आप किसी भी तरह से ऐसी स्थिति उत्पन्न करने के लिए मूल्यों का उपयोग कर सकते हैं, जो आपको एक ऐसी स्थिति उत्पन्न करने के लिए पसंद है, जो आपके अनुकूल हो।


3
आह, सब कुछ
नकारात्मक

8
क्या आप इस उत्तर पर थोड़ा विस्तार कर सकते हैं? मुझे यकीन नहीं है कि इसका उपयोग कैसे करना है। क्या करता conditionConverterहै? हम orइस उदाहरण में "पोर्टलैंड" और "ओआर" को हमारे दो विकल्पों के रूप में कैसे निर्दिष्ट कर रहे हैं ?
DLeh

4
@ cod3monk3y, आपका लिंक टूट गया है।
Spidermain50

22

@ सेरीन के उत्तर पर विस्तार से और गैर-तुच्छ बहु-मूल्य वाली स्थिति के साथ काम करने के बारे में समझाने के लिए: मुझे बूलियन स्थिति के लिए एक आइटम पर "डिम-आउट" ओवरले दिखाने की आवश्यकता थी NOT a AND (b OR NOT c)

पृष्ठभूमि के लिए, यह एक "बहुविकल्पी" प्रश्न है। यदि उपयोगकर्ता एक गलत उत्तर चुनता है तो वह अक्षम हो जाता है (बाहर मंद हो जाता है और उसे फिर से नहीं चुना जा सकता है)। एक स्वचालित एजेंट के पास स्पष्टीकरण देने के लिए किसी विशेष विकल्प पर ध्यान केंद्रित करने की क्षमता है (सीमा पर प्रकाश डाला गया)। जब एजेंट किसी वस्तु पर ध्यान केंद्रित करता है, तो उसे अक्षम होने पर भी मंद नहीं होना चाहिए । सभी आइटम जो फ़ोकस में नहीं हैं, उन्हें डी-फ़ोकस के रूप में चिह्नित किया गया है , और उन्हें मंद करना चाहिए।

इस प्रकार डिमिंग के लिए तर्क है:

NOT IsFocused AND (IsDefocused OR NOT Enabled)

इस तर्क को लागू करने के लिए, मैंने IMultiValueConverterअपने तर्क का मिलान करने के लिए एक सामान्य नाम (अजीब तरह से) बनाया

// 'P' represents a parenthesis
//     !  a &&  ( b ||  !  c )
class NOT_a_AND_P_b_OR_NOT_c_P : IMultiValueConverter
{
    // redacted [...] for brevity
    public object Convert(object[] values, ...)
    {
        bool a = System.Convert.ToBoolean(values[0]);
        bool b = System.Convert.ToBoolean(values[1]);
        bool c = System.Convert.ToBoolean(values[2]);

        return !a && (b || !c);
    }
    ...
}

XAML में मैं संसाधन MultiDataTriggerमें इसका उपयोग करता हूं<Style><Style.Triggers>

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <!-- when the equation is TRUE ... -->
        <Condition Value="True">
            <Condition.Binding>
                <MultiBinding Converter="{StaticResource NOT_a_AND_P_b_OR_NOT_c_P}">
                    <!-- NOT IsFocus AND ( IsDefocused OR NOT Enabled ) -->
                    <Binding Path="IsFocus"/>
                    <Binding Path="IsDefocused" />
                    <Binding Path="Enabled" />
                </MultiBinding>
            </Condition.Binding>
        </Condition>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
        <!-- ... show the 'dim-out' overlay -->
        <Setter Property="Visibility" Value="Visible" />
    </MultiDataTrigger.Setters>
</MultiDataTrigger>

और पूर्णता के लिए, मेरे कन्वर्टर को ए में परिभाषित किया गया है ResourceDictionary

<ResourceDictionary xmlns:conv="clr-namespace:My.Converters" ...>
    <conv:NOT_a_AND_P_b_OR_NOT_c_P x:Key="NOT_a_AND_P_b_OR_NOT_c_P" />
</ResourceDictionary>

11
मुझे नहीं लगता कि यह कन्वर्टर्स का इरादा इस तरह इस्तेमाल किया जाना है। वे वास्तव में प्रदर्शन के लिए मूल्यों को परिवर्तित करने के लिए हैं। जब यह जटिल हो जाता है, तो बस उस दृश्य मॉडल पर एक गणना की गई संपत्ति बनाएं जो आपको वह देता है जो आपको चाहिए।
मार्टिन कैपोडिसी

13
हालांकि नामकरण
केली एल्टन

13
कृपया याद रखें कि जब प्रोग्रामिंग एक शिल्प था और कोड सुरुचिपूर्ण था, तो याद रखना।
फजी लॉजिक

0

यह उत्तर केवल उन लोगों के लिए है,


यदि आप AND तर्क को लागू करना चाहते हैं, तो आपको MultiTrigger का उपयोग करना चाहिए, यहाँ एक उदाहरण है:

मान लीजिए कि हम कुछ कार्य करना चाहते हैं यदि संपत्ति पाठ = "" (खाली स्ट्रिंग) और ANDKeyboardFocused = "गलत", तो आपका कोड निम्नलिखित जैसा दिखना चाहिए:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="Text" Value="" />
        <Condition Property="IsKeyboardFocused" Value="False" />
    </MultiTrigger.Conditions>
        <MultiTrigger.EnterActions>
            <!-- Your actions here -->
        </MultiTrigger.EnterActions>
</MultiTrigger>

यदि आप OR लॉजिक लागू करना चाहते हैं, तो कुछ तरीके हैं, और यह इस पर निर्भर करता है कि आप क्या करने की कोशिश करते हैं:

पहला विकल्प मल्टीपल ट्रिगर का उपयोग करना है।
तो, मान लीजिए कि आप कुछ करना चाहते हैं यदि या तो पाठ = "" या IsKeyboardFocused = "गलत" है,
तो आपके कोड को कुछ इस तरह दिखना चाहिए:

<Trigger Property="IsEnabled" Value="false">
    <Setter Property="Opacity" TargetName="border" Value="0.56"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
    <Setter Property="BorderBrush" TargetName="border" 
            Value="{StaticResource TextBox.MouseOver.Border}"/>
</Trigger>


लेकिन इसमें समस्या यह है कि अगर मैं ISN'T null या IsKeyboard = "ट्रू" टेक्स्ट या तो कुछ करना चाहता हूँ तो मैं क्या करूँगा ? यह दूसरे दृष्टिकोण से प्राप्त किया जा सकता है:
रिकॉल डी मॉर्गन का नियम, जो कहता है! (! X &&! Y) = x || y।
इसलिए हम जब पाठ = "" और IsKeyboard = "सही", और हम में हमारे कार्यों करूँगा यह पिछले समस्या को हल करने, एक बहु ट्रिगर लिख कर इस्तेमाल करेंगे कि ट्रिगर किए जाने पर बाहर निकलें कार्रवाई , इस तरह:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="Text" Value="" />
        <Condition Property="IsKeyboardFocused" Value="False" />
    </MultiTrigger.Conditions>
    <MultiTrigger.ExitActions>
        <!-- Do something here -->
    </MultiTrigger.ExitActions>
</MultiTrigger>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.