ডাব্লুপিএফ-তে ডেটা ট্রিগার করার জন্য আমি কীভাবে একাধিক শর্ত সরবরাহ করতে পারি?
ডাব্লুপিএফ-তে ডেটা ট্রিগার করার জন্য আমি কীভাবে একাধিক শর্ত সরবরাহ করতে পারি?
উত্তর:
মাল্টিডেটাট্রিগার টাইপ ব্যবহার করুন
<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>
এই উত্তরটি অ্যানিমেশন শুধুমাত্র জন্য
আপনি বাস্তবায়ন ওয়ানা এবং যুক্তিবিদ্যা, আপনি MultiTrigger ব্যবহার করা উচিত, তবে এখানে একটি উদাহরণ রয়েছে:
ধরুন আমরা যদি সম্পত্তি টেক্সট = "" (খালি STRING) কিছু ক্রিয়ার কাজ করতে চান এবং IsKeyboardFocused = "false", তারপর আপনার কোডটি নিম্নলিখিতগুলির মতো হওয়া উচিত:
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Text" Value="" />
<Condition Property="IsKeyboardFocused" Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<!-- Your actions here -->
</MultiTrigger.EnterActions>
</MultiTrigger>
যদি আপনি OR যুক্তিটি বাস্তবায়ন করতে চান তবে কয়েকটি উপায় রয়েছে এবং আপনি যা করার চেষ্টা করছেন তার উপর এটি নির্ভর করে:
প্রথম বিকল্পটি হ'ল একাধিক ট্রিগার ব্যবহার করা।
সুতরাং, ধরুন আপনি যদি পাঠ্য = "" বা ইসকায়বোর্ডফোকাসড = "মিথ্যা" হন
তবে আপনি কিছু করতে চান তবে আপনার কোডটি এর মতো দেখতে হবে:
<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 টি বাতিল হয় না বা ইসকিরবোর্ড = "সত্য"? এটি দ্বিতীয় পদ্ধতির মাধ্যমে অর্জন করা যেতে পারে:
দে মরগানের নিয়মটি পুনরায় স্মরণ করুন, যা বলে! (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>