Làm cách nào tôi có thể cung cấp nhiều điều kiện để kích hoạt dữ liệu trong WPF?Làm thế nào tôi có thể cung cấp nhiều điều kiện để kích hoạt dữ liệu trong WPF?
Trả lời
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>
@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.
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 :) –
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
@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
Để 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>
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. –
Đặt tên đó mặc dù –
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. –
- 1. Mẫu dữ liệu có điều kiện trong WPF
- 2. Làm thế nào để sử dụng SBCL cung cấp semaphore chống lại điều kiện chủng tộc
- 3. Làm thế nào để biết một card đồ họa có cung cấp phần cứng cho wpf
- 4. Đặt một bảo vệ trên một kích hoạt sự kiện WPF. Điều này có thể không?
- 5. Backbone.js - sử dụng trình kích hoạt để kích hoạt sự kiện và truyền dữ liệu
- 6. Làm cách nào để dữ liệu liên kết dữ liệu phân cấp với TreeView WPF?
- 7. WPF: Điều kiện kích hoạt khi Không có sản phẩm nào chuỗi
- 8. Trình kích hoạt dữ liệu WPF và bảng câu chuyện
- 9. Làm thế nào để bạn có điều kiện tạo kiểu ô trong lưới dữ liệu Dojo?
- 10. Làm thế nào tôi có thể thay thế có điều kiện trong Perl?
- 11. Làm thế nào để thiết lập sự kiện/kích hoạt MouseOver cho đường viền trong XAML?
- 12. Làm thế nào để kích hoạt sự kiện "onload" trên tài liệu trong IE
- 13. Làm thế nào để chặn cho đến khi một sự kiện được kích hoạt trong C#
- 14. Làm cách nào tôi có thể cung cấp triển khai GetSizeForItem trong UICollectionViewController?
- 15. Làm thế nào tôi có thể cung cấp cho trình biên dịch Intellij nhiều không gian hơn?
- 16. Làm thế nào để cung cấp cho một "Empty ListView tin nhắn" khi không có nguồn dữ liệu
- 17. Làm cách nào để biết dữ liệu nào được cung cấp trong Gói?
- 18. Làm thế nào tôi có thể cung cấp liên kết bên ngoài cho UIButton?
- 19. Làm cách nào để cung cấp URL cho việc thu thập dữ liệu để thu thập dữ liệu?
- 20. Có động cơ nguồn cấp dữ liệu tin tức (sự kiện/hoạt động) nào không?
- 21. Làm thế nào tôi có thể xử lý sự kiện bấm bánh xe chuột trong WPF?
- 22. Tạo trình kích hoạt SQL có điều kiện trong SQLite
- 23. Làm thế nào tôi có thể lấy tên bảng trong một hàm kích hoạt PostgreSQL?
- 24. Làm thế nào để cung cấp các dịch vụ hoạt động cao?
- 25. Làm thế nào tôi có thể cung cấp bộ nhớ thực hơn 512M?
- 26. Làm thế nào tôi có thể thấy ai đã kích hoạt một hành động trong Delphi?
- 27. Làm thế nào tôi có thể. Bao gồm nhiều hơn một cấp trong LINQ?
- 28. Làm thế nào tôi có thể thực hiện một sưu tập có điều kiện trong groovy
- 29. Làm thế nào tôi có thể gọi tái diễn nếu có điều kiện trong Clojure?
- 30. Làm cách nào tôi có thể đánh dấu Caret vào một Điều khiển trong WPF
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
@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
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. –