WPF में डेटा ट्रिगर के लिए मैं कई शर्तें कैसे प्रदान कर सकता हूं?
WPF में डेटा ट्रिगर के लिए मैं कई शर्तें कैसे प्रदान कर सकता हूं?
जवाबों:
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>
@ अंजोंक - यदि आप "या" चाहते हैं, तो (ए और बी) के बाद से सभी शर्तों को नकारें <=> ~ (~ ए (~ ए / बी))
लेकिन अगर आपके पास बूलियन के अलावा अन्य प्रकार हैं जो कन्वर्टर्स का उपयोग करते हैं:
<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>
आप किसी भी तरह से ऐसी स्थिति उत्पन्न करने के लिए मूल्यों का उपयोग कर सकते हैं, जो आपको एक ऐसी स्थिति उत्पन्न करने के लिए पसंद है, जो आपके अनुकूल हो।
conditionConverter
है? हम or
इस उदाहरण में "पोर्टलैंड" और "ओआर" को हमारे दो विकल्पों के रूप में कैसे निर्दिष्ट कर रहे हैं ?
@ सेरीन के उत्तर पर विस्तार से और गैर-तुच्छ बहु-मूल्य वाली स्थिति के साथ काम करने के बारे में समझाने के लिए: मुझे बूलियन स्थिति के लिए एक आइटम पर "डिम-आउट" ओवरले दिखाने की आवश्यकता थी 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>
यह उत्तर केवल उन लोगों के लिए है,
यदि आप 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>