Tôi đang viết một ứng dụng WPF sử dụng mô hình MVVM, căn cứ vào bài viết sau đây: WPF Apps With The Model-View-ViewModel Design Patterncó lập trình đánh giá lại các lệnh của MVVM "có thể thực hiện" nhà nước
Tôi có hai nút trên Xem của tôi với các nút " Command "property bound (với ràng buộc dữ liệu) cho một cá thể đã cho của lớp RelayCommand (xem" Hình 3 Lớp RelayCommand "từ bài viết ở trên). Lớp RelayCommand hỗ trợ kiểm tra xem liệu lệnh đã cho có thể được thực hiện hay không.
WPF tự động tắt các nút không thể thực thi lệnh.
Mỗi lệnh của tôi (trong lớp ViewModel) bắt đầu thao tác nền và lệnh không thể được thực hiện lại cho đến khi thao tác nền hoàn tất. Các thể hiện RelayCommand có thông tin cho dù hoạt động nền vẫn đang hoạt động hay nó đã kết thúc.
Sự cố của tôi như sau: sau khi nhấn bất kỳ nút nào, nút tự động bị tắt (OK) vì thao tác nền bắt đầu và lệnh không thể được thực thi cho đến khi hoàn tất, nhưng sau khi thao tác hoàn tất , các nút không được kích hoạt tự động vì vị từ "có thể được thực thi" của lệnh không tự động được đánh giá lại. Việc đánh giá lại có thể được kích hoạt bằng tay bằng cách ứng dụng lỏng lẻo và lấy lại tiêu điểm (bằng cách nhấn ALT + TAB). Sau khi thực hiện thủ thuật này, các nút được kích hoạt lại một lần nữa.
Làm cách nào tôi có thể đánh giá lại chương trình của trạng thái lệnh "có thể thực thi" của chương trình?
Đây là điều rất giống với dự đoán đầu tiên của tôi, nhưng, với một số lý do không rõ đối với tôi, nó dường như không hoạt động. Tôi gọi phương thức tĩnh này ("CommandManager.InvalidateRequerySuggested") mỗi khi trạng thái của chương trình (như Idle, Working, PendingStop vv) thay đổi, nó chỉ thuộc tính trạng thái được sử dụng trong trình xử lý canExecute. Tuy nhiên, nó dường như không hoạt động (mặc dù tôi đồng ý rằng nó nên). BTW, đi và kiểm tra việc thực hiện ICommand, đó là trong bài viết tôi đã tham chiếu trước đây, hình 3. – dzs
Có nó thực sự phụ thuộc vào cách ICommand đã được thực hiện. Tôi đã cập nhật câu trả lời của tôi chi tiết cách tôi nhận được CanExecute tái truy vấn trong Prism. Tôi sẽ xem bài viết bạn đang theo dõi. –
Đây có phải là một cái gì đó có thể làm với thực hiện InvalidateRequerySuggested() trên một chủ đề không phải UI?Hãy thử sử dụng Dispatcher để gọi nó, để nó được gọi trên thread UI. –