ฉันจะระบุเงื่อนไขหลายอย่างสำหรับทริกเกอร์ข้อมูลใน 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>
@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>
คุณสามารถใช้ค่าในวิธีการแปลงในแบบที่คุณต้องการในการสร้างเงื่อนไขที่เหมาะสมกับคุณ
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 ต่อไปนี้เป็นตัวอย่าง:
สมมติว่าเราต้องการดำเนินการบางอย่างถ้าคุณสมบัติ Text = "" (สตริงว่าง) และ 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 มีหลายวิธีขึ้นอยู่กับสิ่งที่คุณพยายามทำ:
ตัวเลือกแรกคือใช้ทริกเกอร์หลายตัว
ดังนั้นสมมติว่าคุณต้องการทำอะไรถ้า Text = "" หรือ IsKeyboardFocused = "False"
รหัสของคุณควรมีลักษณะดังนี้:
<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>
แต่ปัญหาในนี่คือสิ่งที่ฉันจะทำถ้าฉันต้องการที่จะทำอะไรถ้าอย่างใดอย่างหนึ่งข้อความไม่ว่างหรือ IsKeyboard = "จริง"? สิ่งนี้สามารถทำได้โดยวิธีที่สอง:
กฎของ Recall De Morgan, ที่บอกว่า! (! x &&! y) = x || Y
ดังนั้นเราจะใช้มันเพื่อแก้ปัญหาก่อนหน้านี้โดยการเขียนทริกเกอร์หลายตัวที่มันถูกเรียกเมื่อ Text = "" และ IsKeyboard = "True" และเราจะดำเนินการในEXIT ACTIONSดังนี้:
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Text" Value="" />
<Condition Property="IsKeyboardFocused" Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.ExitActions>
<!-- Do something here -->
</MultiTrigger.ExitActions>
</MultiTrigger>