无法在使用 CommunityToolkit.Mvvm 的视图模型中使用 ICommand 属性

在我的视图模型中,我想在 CommunityToolkit.Mvvm 中使用源生成器,但由于某种原因,我似乎无法将 [ICommand] 属性与我的操作方法一起使用。

我得到的错误是:

无法应用属性类“ICommand”,因为它是抽象的

这是我的视图模型模型的基类。

using CommunityToolkit.Mvvm.ComponentModel;

namespace MyApp.ViewModels
{
    public partial class BaseViewModel : ObservableObject
    {
        [ObservableProperty]
        bool isBusy = false;

        [ObservableProperty]
        string title = string.Empty;
    }
}

这是我的视图模型类:

public class MyViewModel : BaseViewModel
{
   [ObservableProperty]
   string firstName;

   [ObservableProperty]
   string lastName;

   [ICommand] // <-- This is where I get the error I mentioned above
   async Task DoSomething()
   {
       // Do something here...
   }
}
stack overflow Can't use ICommand attribute in view model using CommunityToolkit.Mvvm
原文答案
author avatar

接受的答案

问题似乎是@Luca Clavarino 在评论中提到的:

也许您不小心使用了 System.Windows.Input 中的 ICommand 接口,而不是 CommunityTookit 中的 ICommandAttribute 。尝试将 [ICommand] 替换为 [CommunityToolkit.Mvvm.Input.ICommand] 并查看是否是这种情况。

我想我知道为什么这会发生在你身上。 CommunityToolkit.Mvvm 8.0.0-preview4 中似乎缺少 ICommandAttribute ,因此智能感知不会提供 using CommunityToolkit.Mvvm.Input 语句,而是提供 using System.Windows.Input;

该问题可以通过降级到 CommunityToolkit.Mvvm 8.0.0-preview3 来解决,该版本对我来说很好用。

这是一个工作示例(使用 CommunityToolkit.Mvvm 8.0.0-preview3)。

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

namespace MyApp.ViewModels
{
    public partial class BaseViewModel : ObservableObject
    {
        [ObservableProperty]
        bool isBusy = false;

        [ObservableProperty]
        string title = string.Empty;
    }

    public partial class MyViewModel : BaseViewModel
    {
        [ObservableProperty]
        string firstName;

        [ObservableProperty]
        string lastName;

        [ICommand] //works in 8.0.0-preview3
        async Task DoSomething()
        {
            // Do something here...
        }
    }
}

我还注意到,虽然 ICommandAttribute 在 8.0.0-preview4 中消失了,但有一个 RelayCommandAttribute 代替。也许他们只是简单地重命名了它。

在 8.0.0-preview4 中使用 RelayCommandAttribute 而不是 ICommandAttribute 似乎有效。

[RelayCommand] //works in 8.0.0-preview4
async Task DoSomething()
{
    // Do something here...
}

编辑

是的,他们已将 ICommandAttribute 重命名为 RelayCommandAttribute 。它在 8.0.0-preview4 release notes 的重大更改部分中提到。


答案:

作者头像

接受的答案有很多文字只是说在 8.0.0 Preview 4[ICommand] 属性已重命名为 [RelayCommand] 。它列在 release notes 的重大更改中。

作者头像

适用于 8.0.0-preview3 而不是 8.0.0-preview4 或最新版本 8.0.0。