我应该如何使用 Avalonia(ReactiveUI) 控制命令的可执行性?
Posted
技术标签:
【中文标题】我应该如何使用 Avalonia(ReactiveUI) 控制命令的可执行性?【英文标题】:How should I make a controlling executability of command using Avalonia(ReactiveUI)? 【发布时间】:2021-08-25 23:21:32 【问题描述】:我正在尝试根据本指南实现控制 ReactiveUI 命令的可执行性:guide. 但是我遇到了一个异常:“由于对象的当前状态,操作无效。” 我应该如何解决这个问题? 我的代码示例:
public class CreateBookViewModel : ViewModelBase
IObservable<bool> canExecuteCreateBookCommand;
private string? name;
private string? path;
public ReactiveCommand<Unit, Unit> ChangePathCommand get;
public ReactiveCommand<Unit, EditBookViewModel?> CreateBookCommand get;
public string? Name
get => name;
set => this.RaiseAndSetIfChanged(ref name, value);
public string? Path
get => path;
set => this.RaiseAndSetIfChanged(ref path, value);
public CreateBookViewModel()
canExecuteCreateBookCommand = this.WhenAnyValue(x => x.path, x => x.name, (name, path) =>
!string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(path));
ChangePathCommand = ReactiveCommand.CreateFromTask(RunChangePath);
CreateBookCommand = ReactiveCommand.Create(RunCreateBook, canExecuteCreateBookCommand);
private async Task RunChangePath()
var dialog = new OpenFolderDialog();
Path = await dialog.ShowAsync(CreateBookWindow.Instance);
private EditBookViewModel? RunCreateBook()
if(name!= null && path!= null)
EditBookViewModel book = new EditBookViewModel(name, path);
return book;
return null;
【问题讨论】:
【参考方案1】:在this.WhenAnyValue
中,您的选择器表达式指向字段而不是属性。将其更改为
this.WhenAnyValue(x => x.Path, x => x.Name, (name, path) => !string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(path));
.
【讨论】:
以上是关于我应该如何使用 Avalonia(ReactiveUI) 控制命令的可执行性?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Avalonia.ReactiveUI 中使用 Autofac 作为 DI 容器?
如何在 Windows 和 Linux 系统上使用 Avalonia 框架处理系统关闭事件?