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 格式作为方法名称——因此,必须以大写字母。
只是想知道是否有任何“官方”记录了这种行为,因为它让我陷入了困境。
提前致谢。
使用 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] 属性来修饰方法时,请确保方法名称的第一个字符是大写的。
| 归档时间: |
|
| 查看次数: |
3300 次 |
| 最近记录: |