如果方法名称以小写字符开头,.Net Maui [RelayCommand] 无法编译?

bdc*_*der 2 .net-maui maui-community-toolkit

.Net MAUI 新手,正在将 CommunityToolkit.Mvvm 版本 8.0.0 与 Microsoft Visual Studio Community 2022(64 位)一起使用 - 当前版本 17.3.3

在我的 XAML 中,我有一个按钮:

<Button 
   Text="Add"
   Command="{Binding data_addCommand}"
   />
Run Code Online (Sandbox Code Playgroud)

在我的 ViewModel 中,我有以下方法:

[RelayCommand]
private void data_add()
{

}
Run Code Online (Sandbox Code Playgroud)

当我构建时,编译器失败并显示以下内容:

Error   CS0102  The type '[my_viewmodel_name]' already contains a definition for 'data_addCommand'
Run Code Online (Sandbox Code Playgroud)

然而,出于无奈,我将 XML 更改为:

<Button 
   Text="Add"
   Command="{Binding Data_addCommand}"
   />
Run Code Online (Sandbox Code Playgroud)

...在我的 ViewModel 中:

[RelayCommand]
private void Data_add()
{

}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是 Binding 命令中的方法名称和 ViewModel 中的方法名称以大写“D”开头,而不是小写“d”。

当我构建时,它成功完成!- ?? -- 我是否错过了文档中规定 [RelayCommand] 的方法名称必须以大写字母开头的内容?

我记得当使用 [ObservableProperty] 属性时,生成的属性将自动使用 UpperCamelCase 格式作为其名称。但是,我不记得看到过任何有关 [RelayCommand] 的内容。我假设情况就是这样(请原谅双关语),并且 [RelayCommand] 属性将与 [ObservableProperty] 属性一样工作——也就是说,将使用 UpperCamelCase 格式作为方法名称——因此,必须以大写字母。

只是想知道是否有任何“官方”记录了这种行为,因为它让我陷入了困境。

提前致谢。

bdc*_*der 6

使用 MVVM CommunityToolkit 时,即当您将 NuGet 包“CommunityToolkit.Mvvm”包含到项目中,然后使用 [RelayCommand] 属性来修饰方法名称时,工具包会自动生成一个使用小写的支持字段。该工具包还将自动生成 IRelayCommand 对象。

例如,如果您有以下代码:

[RelayCommand]
private void method_name()
{

}
Run Code Online (Sandbox Code Playgroud)

以下代码将由 CommunityToolkit 自动生成:

// A backing field ...
private global::CommunityToolkit.Mvvm.Input.RelayCommand? method_nameCommand;

// An IRelayCommand object ...
public global::CommunityToolkit.Mvvm.Input.IRelayCommand method_nameCommand => method_nameCommand ??= new global::CommunityToolkit.Mvvm.Input.RelayCommand(new global::System.Action(method_name));
Run Code Online (Sandbox Code Playgroud)

自动生成的代码会导致支持字段名称和 IRelayCommand 对象名称相同,从而导致编译器错误。

现在,如果您将方法名称更改为使用大写字符,即:

[RelayCommand]
private void Method_name()
{

}
Run Code Online (Sandbox Code Playgroud)

自动生成的代码如下所示,并且将成功编译。

// A backing field ...
private global::CommunityToolkit.Mvvm.Input.RelayCommand? method_nameCommand;

// An IRelayCommand object ...
public global::CommunityToolkit.Mvvm.Input.IRelayCommand Method_nameCommand => method_nameCommand ??= new global::CommunityToolkit.Mvvm.Input.RelayCommand(new global::System.Action(Method_name));
Run Code Online (Sandbox Code Playgroud)

所以 - (未记录的)经验法则似乎是:

当使用 [RelayCommand] 属性来修饰方法时,请确保方法名称的第一个字符是大写的。

  • 但如果您需要 canExecute 条件,这就很糟糕了。整个装饰是社区工具包的一个糟糕的设计选择。 (2认同)