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). Берётся всегда то значение, которое было получено при первом (и единственном) выполнении делегата. Не понимаю, почему так.