我应该如何使用 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 =&gt; x.Path, x =&gt; x.Name, (name, path) =&gt; !string.IsNullOrWhiteSpace(name) &amp;&amp; !string.IsNullOrWhiteSpace(path));.

【讨论】:

以上是关于我应该如何使用 Avalonia(ReactiveUI) 控制命令的可执行性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Avalonia.ReactiveUI 中使用 Autofac 作为 DI 容器?

Avalonia:如何使用代码为路径中的点设置动画

如何在 Windows 和 Linux 系统上使用 Avalonia 框架处理系统关闭事件?

Avalonia 如何创建自定义弹出窗口

Avalonia:如何以编程方式向 UserControl 添加控件

如何在 Avalonia 应用程序中为 OpenFolderDialog 设置标题?