ICommand передает CanExecute с отправителем в viewmodel

Я пытаюсь реализовать решение для проверки ошибок, описанное здесь, но я не могу найти способ сделать это. В верхнем ответе метод

private void CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = IsValid(sender as DependencyObject);
}

получает отправителя и CanExecuteRoutedEventArgs из представления. Это подразумевает, что метод должен быть реализован в представлении. Как это вещь? CanExecute - это свойство класса Command, которое следует использовать только в классе viewmodel. Поскольку наследование от интерфейса ICommand позволяет только следующую реализацию:

public bool CanExecute(object parameter)
{
     throw new NotImplementedException();
}

Как я должен получить информацию об объекте в модели представления и передать их методу CanExecute команды?

Вот моя текущая реализация, я пытался обойти это, но без передачи метода делегату он бесполезен.

Посмотреть:

<Button Command="{Binding Path=GenerateBinaryFileCommand}">
  <Button.CommandBindings>
    <CommandBinding CanExecute="CanExecute"/>
      </Button.CommandBindings>
  </Button>

View.cs:

private void CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        ViewModel vm = (ViewModel )DataContext;
        e.CanExecute = vm.IsValid(sender as DependencyObject);
    }

ViewModel.cs:

private DelegateCommand generateBinaryCommand;

public bool IsValid(DependencyObject obj)
        {
            // The dependency object is valid if it has no errors and all
            // of its children (that are dependency objects) are error-free.
            return !Validation.GetHasError(obj) &&
            LogicalTreeHelper.GetChildren(obj)
            .OfType<DependencyObject>()
            .All(IsValid);
        }

public ICommand GenerateBinaryFileCommand
        {
            get
            {
                if (generateBinaryCommand == null)
                {
                    // here is where I need to pass the CanExecute method
                    generateBinaryCommand = new DelegateCommand(generateBinary);
                }
                return generateBinaryCommand;
            }
        }

1 ответ

Хотя сама проблема остается нерешенной, мне удалось обойти эту проблему с помощью UpdateSourceExceptionFilter описано здесь - я рекомендую использовать этот подход для проверки.

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