2009-05-25 24 views

Trả lời

238

Sử dụng MultiDataTrigger loại

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

Có cách nào để làm một "OR" tuyên bố trong multiTrigger. ví dụ. tên = "portland" HOẶC trạng thái = "OR" – jasonk

+10

@jasonk - Không chắc chắn liệu bạn có thể làm điều đó với một MultiTrigger hay không. Bạn có thể xác định hai trình kích hoạt cho điều đó .. – Gishu

+0

Nếu đó là câu lệnh OR đơn giản, bạn có thể đảo ngược logic để nó chuyển thành AND. | condition1 | condition2 | kết quả | | đúng | đúng | đúng | | đúng | sai | đúng | | sai | đúng | đúng | | sai | sai | sai | thay vì kiểm tra một trong hai/HOẶC là đúng, hãy kiểm tra khi cả hai/AND là sai và đặt mặc định thành true. –

39

@jasonk - nếu bạn muốn có "hoặc" sau đó phủ nhận tất cả các điều kiện kể từ (A và B) < => ~ (~ A hoặc B ~)

nhưng nếu bạn có các giá trị khác với boolean, hãy thử sử dụng các trình biến đổi loại:

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

bạn có thể sử dụng các giá trị trong phương pháp Chuyển đổi theo cách bạn muốn tạo ra điều kiện phù hợp với bạn.

+1

Ah, di chuyển thông minh để phủ nhận tất cả mọi thứ và lật nó vào một điều kiện OR :) –

+5

Bạn có thể mở rộng câu trả lời này một chút không? Tôi không biết cách sử dụng nó. 'ConditionConverter' làm gì?Làm cách nào để chúng tôi chỉ định "Portland" và "HOẶC" làm hai tùy chọn 'hoặc' trong ví dụ này? – DLeh

+0

@DLeh - [Đây là một hướng dẫn tốt] (http://tech.pro/tutorial/809/wpf-tutorial-using-multibindings) về cách sử dụng 'MultiBinding'. – cod3monk3y

14

Để xây dựng trên @serine's answer và minh họa làm việc với điều kiện không đáng giá nhiều: tôi cần phải hiển thị lớp phủ "mờ" trên một mục cho điều kiện boolean NOT a AND (b OR NOT c).

Đối với nền, đây là câu hỏi "Nhiều lựa chọn". Nếu người dùng chọn một câu trả lời sai, nó sẽ trở thành bị vô hiệu hóa (bị mờ đi và không thể được chọn lại). Một tác nhân tự động có khả năng tập trung vào bất kỳ lựa chọn cụ thể nào để đưa ra giải thích (được đánh dấu đường viền). Khi tác nhân tập trung vào một mục, nó không bị mờ đi ngay cả khi nó bị tắt. Tất cả các mục không tập trung được đánh dấu không tập trung và sẽ bị mờ đi.

Logic cho mờ là như sau:

NOT IsFocused AND (IsDefocused OR NOT Enabled)

Để thực hiện logic này, tôi đã thực hiện một generic IMultiValueConverter tên (ngượng nghịu) để phù hợp với logic của tôi

// '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); 
    } 
    ... 
} 

Trong XAML Tôi sử dụng số này trong một số MultiDataTrigger trong một tài nguyên <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> 

Và vì lợi ích của sự hoàn chỉnh, chuyển đổi của tôi được định nghĩa trong một 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> 
+7

Tôi không nghĩ đây là ý định chuyển đổi được sử dụng theo cách này. Chúng thực sự có ý nghĩa để chuyển đổi các giá trị cho hiển thị. Khi nó trở nên phức tạp, chỉ cần tạo một thuộc tính được tính toán trên mô hình khung nhìn cung cấp cho bạn những gì bạn cần. –

+5

Đặt tên đó mặc dù –

+2

Hãy dành một chút thời gian im lặng để nhớ khi lập trình là một nghề thủ công và mã được thanh lịch. –

Các vấn đề liên quan