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
описано здесь - я рекомендую использовать этот подход для проверки.