tôi thấy ba giải pháp khác nhau để gọi lệnh tôi CanExecute
và Execute
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()
Cám ơn tìm ra quanh công việc cho CanExecute (null) khi nâng cấp từ 6,5. –
Tôi thích phương thức 'InvokeCommand' hơn. – Felix