2012-06-22 24 views
8

Tôi đã tự hỏi làm thế nào để bạn quyết định khi nào sử dụng converters và khi nào sử dụng triggers. Tôi thích sử dụng trình kích hoạt cho các thao tác trên GUI (như hiển thị/ẩn các điều khiển, thay đổi giao diện của chúng, v.v.). Một số thời gian trước đây tôi đã sử dụng một BooleanToVisibilityConverter cho mục đích này nhưng bây giờ, tôi chỉ không cần nó, tôi làm tất cả mọi thứ kết nối với visibility bằng cách sử dụng một kích hoạt và tôi thậm chí bắt đầu nghĩ "mục đích của việc tạo ra là gì a BooleanToVisibilityConverter bởi nhóm MS? ". Nói chung, khi có thể tôi cố gắng sử dụng một cách khai báo để viết mã - trong ví dụ này - XAML.Tôi có nên sử dụng trình chuyển đổi hoặc trình kích hoạt WPF không?

Ý kiến ​​của bạn về điều đó là gì?

+0

trình kích hoạt được sử dụng để kiểm tra giá trị đơn lẻ, nơi bộ chuyển đổi được sử dụng cho loại chuyển đổi giá trị phức tạp và khác biệt. – JSJ

+0

Câu hỏi tương tự gợi ý tới chi phí hiệu suất của trình biến đổi - http://stackoverflow.com/questions/5508159/datatrigger-vs-databinding-with-converter-performance-wise – akjoshi

Trả lời

13

Tôi đồng ý với bạn, tôi cũng cố gắng sử dụng mã khai báo trong XAML và thích Triggers thay vì Converters.

Trong hầu hết các trường hợp, trình kích hoạt có thể thực hiện cùng một công việc như bất kỳ trình chuyển đổi nào nhưng Converters có thể có logic tùy chỉnh/kinh doanh như được đề cập.

Một giới hạn của TriggersNgười định cư trong số DataTriggers chỉ có thể thay đổi các thuộc tính của các thành phần giao diện người dùng của bạn; do đó, bạn không thể cập nhật thuộc tính Chế độ xem của mình bằng trình kích hoạt, đó là nơi giành chiến thắng Converters, hãy nhớ phương thức ConvertBack.

Vì vậy, bạn có thể ràng buộc tài sản ảo của bạn với một điều khiển Visibility sử dụng BooleanToVisibilityConverter và thậm chí nếu điều khiển của bạn visibility được thay đổi bởi một số khác là tài sản ảo của bạn sẽ được cập nhật; nói chung không cần thiết đó là lý do tại sao BooleanToVisibilityConverter được thay thế bằng trình kích hoạt.

Vì vậy, trong ngắn hạn -

Triggers chỉ có thể thực hiện OneWay hoạt động trong khi Converters có thể thực hiện TwoWay hoạt động

+1

nó * vui * cách câu trả lời này gần như giống hệt như [ này khác] (http://stackoverflow.com/a/19474466/540776) – superjos

+0

@superjos Tôi sẽ nói 'làm thế nào câu trả lời khác là gần như chính xác giống như này': D Cảm ơn bạn đã chỉ ra rằng, làm cho tôi mỉm cười :) – akjoshi

+1

có, để ở lại chủ đề này, tôi chỉ cần sao chép-dán bình luận của tôi ở đây và ở đó :) – superjos

1

Bạn có thể đạt được các chức năng bằng cách kích hoạt hoặc chuyển đổi nhưng từ lựa chọn của tôi dưới đây khả năng có thể được xem xét khi đưa ra quyết định

  1. Nếu bạn đang sử dụng phương pháp TDD cho sự phát triển sau đó đi cho bộ chuyển đổi như bạn có thể viết các trường hợp thử nghiệm .
  2. Nếu có bất kỳ logic nghiệp vụ nào tốt hơn cho đúng mã trong trình chuyển đổi và các điều không thể đạt được thông qua trình kích hoạt.
1

Ngoài những gì đã được nói ở trên tôi chỉ có thể thêm:

  • Trình kích hoạt đôi khi yêu cầu những thứ trùng lặp, ví dụ: khi bạn có nhiều thuộc tính cho trình kích hoạt, bạn cần chỉ định từng kết hợp
  • Đôi khi bạn sẽ cần mã để chuyển đổi đúng từ loại A sang B, khi đó bạn phải sử dụng trình chuyển đổi. Kích hoạt là tốt nếu giá trị/tài sản đã được tiếp xúc từ máy ảo theo cách, rằng bạn có thể sử dụng nó để kích hoạt.
2

Theo ý kiến ​​của tôi, bạn đang nhìn từ dưới lên và bạn chỉ cần nhìn từ trên xuống dưới.

Triggers -Khi một điều kiện theo quy định được hoàn thành nó "gây nên" một thực

Converters -Convert giữa hai loại không tương thích.

Tại sao chúng ta cần một kiểu dữ liệu boolean khi chúng ta có thể thực hiện chức năng tương tự với các trình kết nối?

0

Bạn phải luôn thực hiện các hoạt động liên quan đến nghiệp vụ trong đối tượng DomainModel hoặc ít nhất trong đối tượng ViewModel. Làm cho một số công việc kinh doanh trong chuyển đổi không phải là một lựa chọn tốt bởi vì Converters được thiết kế để chuyển đổi một giá trị từ kiểu này sang kiểu khác.

+0

Dida bạn thấy câu hỏi của tôi? Tôi đã viết một cách rõ ràng: "cho các hoạt động trênGUI (như hiển thị/ẩn kiểm soát, thay đổi diện mạo của chúng, v.v.)". Tôi biết rằng các tùy chọn liên quan đến kinh doanh phải được kiểm soát trên đối tượng DomainModel. –

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