كيف يمكنني تقديم شروط متعددة لتشغيل البيانات في WPF؟

StackOverflow https://stackoverflow.com/questions/905932

  •  05-09-2019
  •  | 
  •  

سؤال

كيف يمكنني تقديم شروط متعددة لتشغيل البيانات في 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>

نصائح أخرى

jasonk - إذا كنت ترغب في الحصول على "أو" إذن تنفي جميع الشروط منذ (A و B) <=> ~ (~ A أو ~ B)

ولكن إذا كان لديك قيم أخرى غير المنطقية، فحاول استخدام محولات النوع:

<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>

يمكنك استخدام القيم في طريقة تحويل الطريقة التي ترغب في إنتاج شرط يناسبك.

لتوضيح @ إجابة السرين وتوضيح العمل مع حالة غير تافهة متعددة القيمة: كان لدي حاجة لإظهار تراكب "خافت" على عنصر للحالة المنطقية 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top