В моем проекте используется CommunityToolkit.Mvvm
8.0.
Я использую атрибут [RelayCommand]
, чтобы создать метод для генерации команды.
https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/generators/overview
Почему Click
работает нормально, а OnSelectionChanged
не работает?
Код:
<StackPanel VerticalAlignment = "Center" HorizontalAlignment = "Center">
<TextBlock Text = "{Binding FirstName}"/>
<Button Content = "Click Me" Command = "{Binding OnSelectionChangedCommand}"/>
<Button Content = "Click Me" Command = "{Binding ClickCommand}"/>
</StackPanel>
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
public partial class ViewModel : ObservableObject
{
[ObservableProperty]
private string firstName = "Kevin";
public ViewModel()
{
}
[RelayCommand]
private void OnSelectionChanged()
{
FirstName = "David";
}
[RelayCommand]
private void Click()
{
FirstName = "David";
}
}
Согласно атрибуту RelayCommand, «On» в начале имени метода будет удалено из автоматически сгенерированной команды.
Генератор будет использовать имя метода и добавит «Command» в конце, а также удалит префикс «On», если он присутствует.
Таким образом, имя команды будет SelectionChangedCommand
.
Привет, @emoacht. Я прочитал этот документ, есть ли объяснение, что ·SelectionChangedCommand· нельзя настроить? SelectionChangedCommand уже определен? Это из-за противоречивых определений?
Это правило, как генератор автоматически называет команду. Я предполагаю, что разработчики думали, что "On" в заголовке не обязательно для имени команды, потому что метод, начинающийся с "On", обычно является методом обработки события.
Привет, @emoacht. Таким образом, имя команды будет SelectionChangedCommand. Что заставляет его не работать?
Помимо названия команды, я не знаю вашей реальной проблемы. Может быть, вы можете начать еще один вопрос.
Привет, @emoacht. Вопрос этой темы, почему эта команда не работает.
@wpf: потому что нет свойства команды с именем OnSelectionChangedCommand. Вы привязываетесь к несуществующему свойству.
Когда вы декорируете метод с помощью RelayCommandAttribute
, создается свойство ICommand
, и имя этого сгенерированного свойства будет именем метода с добавлением «Command» в конце.
Как ясно сказано в docs, префикс «On» также будет удален из сгенерированного имени свойства.
Таким образом, ваш пример кода работает просто отлично, если вы просто удалите часть «On» из разметки XAML, поскольку нет сгенерированной команды с именем «OnSelectionChangedCommand»:
<Button Content = "Click Me" Command = "{Binding SelectionChangedCommand}"/>
Есть ли конфликт с исходным кодом? Я не нашел причин, чтобы доказать это.