2016-11-29 15 views
5

Tôi đang cố gắng để chuyển đổi dự án của tôi từ ReactiveUI 6.5 lên phiên bản 7. Trong phiên bản cũ tôi gọiLàm cách nào để thực hiện cuộc gọi trực tiếp tới ReactiveCommand.Execute() trong ReactiveUI 7 chính xác?

// var command = ReactiveCommand.Create...; 
// ... 
if(command.CanExecute(null)) 
    command.Execute(null); 

để thực hiện một lệnh từ mã của tôi phía sau.

Bây giờ, phương pháp CanExecute không còn khả dụng và được thay thế bằng thuộc tính IObservable<bool>. Liệu CanExecute Observable có tự động được gọi nếu tôi chỉ gọi điện đến số Execute().Subscribe() hoặc tôi phải gọi nó một cách rõ ràng?

Để bây giờ tôi thay thế đoạn mã trên với

command.Execute().Subscribe(); 

Trả lời

9

tôi thấy ba giải pháp khác nhau để gọi lệnh tôi CanExecuteExecute phương pháp như tôi có thể trước đây trong ReactiveUI 6.5:

Lựa chọn 1

Điều này tương đương với cuộc gọi trong phiên bản 6.5, nhưng chúng tôi cần chuyển lệnh rõ ràng sang ICommand:

if (((ICommand) command).CanExecute(null)) 
    command.Execute().Subscribe(); 

Lựa chọn 2

if(command.CanExecute.FirstAsync().Wait()) 
    command.Execute().Subscribe() 

hoặc các biến thể async:

if(await command.CanExecute.FirstAsync()) 
    await command.Execute() 

Lựa chọn 3

Một lựa chọn khác là làm cho chúng ta về phương pháp InvokeCommand mở rộng.

Observable.Start(() => {}).InvokeCommand(ViewModel, vm => vm.MyCommand); 

Điều này tôn trọng khả năng thực thi của lệnh, như được đề cập trong documentation.


Để làm cho nó thoải mái hơn Tôi đã viết một phương pháp khuyến nông nhỏ để cung cấp một ExecuteIfPossible và một phương pháp GetCanExecute:

public static class ReactiveUiExtensions 
{ 
    public static IObservable<bool> ExecuteIfPossible<TParam, TResult>(this ReactiveCommand<TParam, TResult> cmd) => 
     cmd.CanExecute.FirstAsync().Where(can => can).Do(async _ => await cmd.Execute()); 

    public static bool GetCanExecute<TParam, TResult>(this ReactiveCommand<TParam, TResult> cmd) => 
     cmd.CanExecute.FirstAsync().Wait(); 
} 

Bạn có thể sử dụng phương pháp mở rộng này như sau:

command.ExecuteIfPossible().Subscribe(); 

Lưu ý: Bạn cần cuộc gọi Subscribe() ở cuối, giống như bạn cần cuộc gọi đến Execute(), khác khôn ngoan không có gì sẽ xảy ra.

Hoặc nếu bạn muốn sử dụng async và chờ đợi:

await command.ExecuteIfPossible(); 

Nếu bạn muốn kiểm tra xem một lệnh có thể được thực hiện, chỉ cần gọi

command.GetCanExecute() 
+0

Cám ơn tìm ra quanh công việc cho CanExecute (null) khi nâng cấp từ 6,5. –

+0

Tôi thích phương thức 'InvokeCommand' hơn. – Felix

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