Созданная CommunityToolkit команда OnSelectionChanged не работает?

В моем проекте используется CommunityToolkit.Mvvm8.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";
            }
        }

Есть ли конфликт с исходным кодом? Я не нашел причин, чтобы доказать это.

wpf 13.12.2022 10:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Согласно атрибуту RelayCommand, «On» в начале имени метода будет удалено из автоматически сгенерированной команды.

Генератор будет использовать имя метода и добавит «Command» в конце, а также удалит префикс «On», если он присутствует.

Таким образом, имя команды будет SelectionChangedCommand.

Привет, @emoacht. Я прочитал этот документ, есть ли объяснение, что ·SelectionChangedCommand· нельзя настроить? SelectionChangedCommand уже определен? Это из-за противоречивых определений?

wpf 14.12.2022 10:58

Это правило, как генератор автоматически называет команду. Я предполагаю, что разработчики думали, что "On" в заголовке не обязательно для имени команды, потому что метод, начинающийся с "On", обычно является методом обработки события.

emoacht 14.12.2022 11:07

Привет, @emoacht. Таким образом, имя команды будет SelectionChangedCommand. Что заставляет его не работать?

wpf 15.12.2022 03:02

Помимо названия команды, я не знаю вашей реальной проблемы. Может быть, вы можете начать еще один вопрос.

emoacht 15.12.2022 03:06

Привет, @emoacht. Вопрос этой темы, почему эта команда не работает.

wpf 15.12.2022 03:10

@wpf: потому что нет свойства команды с именем OnSelectionChangedCommand. Вы привязываетесь к несуществующему свойству.

mm8 15.12.2022 21:56
Ответ принят как подходящий

Когда вы декорируете метод с помощью RelayCommandAttribute, создается свойство ICommand, и имя этого сгенерированного свойства будет именем метода с добавлением «Command» в конце.

Как ясно сказано в docs, префикс «On» также будет удален из сгенерированного имени свойства.

Таким образом, ваш пример кода работает просто отлично, если вы просто удалите часть «On» из разметки XAML, поскольку нет сгенерированной команды с именем «OnSelectionChangedCommand»:

<Button Content = "Click Me" Command = "{Binding SelectionChangedCommand}"/>

Другие вопросы по теме