WPF MVVM Проверка команды на возможность её выполнения

    internal abstract class BaseCommand : ICommand
    {
#pragma warning disable 67
        public event EventHandler CanExecuteChanged;
#pragma warning restore 67

        public abstract bool CanExecute(object parameter);
        public abstract void Execute(object parameter);
    }
    internal class LambdaCommand : BaseCommand
    {
        private readonly Action<object> _execute;
        private readonly Func<object, bool> _canExecute;

        public LambdaCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            _execute = execute;
            _canExecute = canExecute;
        }

        public override bool CanExecute(object parameter)
        {
            return _canExecute != null ? _canExecute.Invoke(parameter) : _execute != null;
        }

        public override void Execute(object parameter)
        {
            _execute.Invoke(parameter);
        }
    }
	    public ModelItem SelectedItem
        {
            get => _selectedItem;
            set
            {
                if (value != _selectedItem)
                {
                    _selectedItem = value;
                    RaisePropertyChanged(nameof(SelectedItem));
                }
            }
        }
        private ModelItem _selectedItem;

XAML:

                    <ListView Grid.Row="1" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
...
                                <MenuItem Header="Копировать ссылку на плейлист" Command="{Binding CopyHlsPlaylistUrlCommand}" />

Команда во вью-модели:

        public LambdaCommand CopyHlsPlaylistUrlCommand { get =>
                new LambdaCommand(
                obj => SetClipboardText(SelectedItem.PlaylistUrl),
                obj => SelectedItem != null && SelectedItem.IsOK); //<<вот эта хрень
        }

Указанный делегат срабатывает только один раз.
То есть. Выделяю какой-то элемент в списке. Нажимаю на нём ПКМ. Срабатывает делегат и метод IsOK возвращает какой-то результат (true / false). В зависимости от этого результата, пункт меню либо включается, либо выключается.
Потом выделяю другие элементы в списке и на каждом жму ПКМ. Но делегат больше не выполняется (ставил breakpoint). Берётся всегда то значение, которое было получено при первом (и единственном) выполнении делегата. Не понимаю, почему так.

«the viewmodel can be changed after it is passed to the command, there should be a way to inform the command about the fact that the viewmodel changed, so it can issue a CanExecuteChanged on its own»

всмысле изменена? :thinking: Кем? На что? Почему?

Тобой, когда ты изменяешь текущее выделение, я так думаю. Но точно не знаю.

Это странно. Всё живёт по каким-то своим неведомым правилам.
Решается, кстати, вот такой фигнёй:

        public event EventHandler CanExecuteChanged
        {
            add => CommandManager.RequerySuggested += value;
            remove => CommandManager.RequerySuggested -= value;
        }

Почему - не понимаю :man_shrugging:

Фигня является неведомой, потому что её не разъяснили, либо разъяснили, но не в том месте, до которого Вы добрались. Пройдёт много лет и информация оботрётся энтузиастами по всему миру и выкристаллизуется в викиучебниках. А до этого времени все будут мучаться. Англоязычные поменьше, прочие побольше.
И тут возникает вопрос, а в какой технологии больше разработчиков в мире - в .Net или в Java? Где больше разработчиков, там обтирание быстрее происходит. Я не знаю ответа.

UPD: Я тут запросил СберАИ, и он сказал, что разработчиков .Net порядка миллионов, разработчиков Java более 10 миллионов.

Это подтверждает мои субъективные необоснованные ощущения (что писа́ть надо на Java-е). При писании на Java можно спокойнее спать и больше полагаться на возможности “помощи сообщества”.

И за это время она успеет несколько раз устареть.

она успеет несколько раз устареть

То-то Вы пользовались технологий Windows Forms, которой более двадцати лет…

Ну WPF тоже уже почти 20 лет :man_shrugging: