ডাব্লুপিএফ-তে ডেটা ট্রিগার করার জন্য আমি কীভাবে একাধিক শর্ত সরবরাহ করতে পারি?


173

ডাব্লুপিএফ-তে ডেটা ট্রিগার করার জন্য আমি কীভাবে একাধিক শর্ত সরবরাহ করতে পারি?

উত্তর:


280

মাল্টিডেটাট্রিগার টাইপ ব্যবহার করুন

<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
মাল্টিট্রিগারে কোনও "OR" বিবৃতি দেওয়ার কোনও উপায় আছে কি? উদাহরণস্বরূপ নাম = "পোর্টল্যান্ড" বা রাজ্য = "OR"
জেসনক

12
@ জেসনক - আপনি মাল্টিট্রিগার দিয়ে এটি করতে পারবেন কিনা তা নিশ্চিত নন। আপনি তার জন্য দুটি ট্রিগার সংজ্ঞা দিতে পারেন ..
গিশু

2
যদি এটি একটি সাধারণ ও শর্তের বিবৃতি হয় তবে আপনি যুক্তিকে বিপরীত করতে পারেন যাতে এটি একটি এন্ডে রূপান্তরিত হয়। | শর্ত 1 | শর্ত 2 | ফলাফল | | সত্য | সত্য | সত্য | | সত্য | মিথ্যা | সত্য | | মিথ্যা | সত্য | সত্য | | মিথ্যা | মিথ্যা | মিথ্যা | উভয় / ওআর সত্য কিনা তা পরীক্ষা করার পরিবর্তে / এবং উভয়ই মিথ্যা কিনা তা পরীক্ষা করে দেখুন এবং ডিফল্টটিকে সত্য হিসাবে সেট করে।
ওয়েসাম আবদুল্লাহ 28:44

3
@ ওয়েসামআবদুল্লাহ আপনি শর্তগুলি মিথ্যা বলে পরীক্ষা করতে পারবেন না।
জিম বাল্টার

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এই উদাহরণে আমরা কীভাবে "পোর্টল্যান্ড" এবং "ওআর" কে দুটি বিকল্প হিসাবে উল্লেখ করছি ?
ডিএলহ

4
@ cod3monk3y, আপনার লিঙ্কটি নষ্ট হয়েছে।
স্পাইডারমাইন

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

এই উত্তরটি অ্যানিমেশন শুধুমাত্র জন্য


আপনি বাস্তবায়ন ওয়ানা এবং যুক্তিবিদ্যা, আপনি 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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.