Пара вещей:
Во-первых, я бы рекомендовал использовать RoutedCommand ApplicationCommands.Save
для реализации обработки кнопки сохранения.
Если вы еще не ознакомились с моделью WPF Command, вы можете получить совок здесь .
<Button Content="Save" Command="Save">
Теперь, чтобы реализовать эту функциональность, вы можете добавить привязку команды к Window / UserControl или к самой кнопке:
<Button.CommandBindings>
<CommandBinding Command="Save"
Executed="Save_Executed" CanExecute="Save_CanExecute"/>
</Button.CommandBindings>
</Button>
Реализуйте их в коде:
private void Save_Executed(object sender, ExecutedRoutedEventArgs e)
{
}
private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
}
В Save_CanExecute
установите e.CanExecute
в зависимости от действительности привязки в текстовом поле.
Если вы хотите реализовать с использованием шаблона проектирования MVVM (Model-View-ViewModel), ознакомьтесь с публикацией Джоша Смита о CommandSinkBinding .
Последнее замечание: если вы хотите, чтобы включение / отключение обновлялось сразу после изменения значения в TextBox
, установите UpdateSourceTrigger="PropertyChanged"
в привязке для TextBox
.
РЕДАКТИРОВАТЬ: Если вы хотите проверить / аннулировать на основе всех привязок в элементе управления, вот несколько предложений.
1) Вы уже внедрили IDataErrorInfo
. Попробуйте реализовать свойство IDataErrorInfo.Error
так, чтобы оно возвращало строку, которая недопустима для всех свойств, с которыми вы связываетесь. Это будет работать, только если весь ваш элемент управления привязан к одному объекту данных. Комплект e.CanExecute = string.IsNullOrEmpty(data.Error);
2) Используйте отражение, чтобы получить все открытые статические свойства DependencyProperties для соответствующих элементов управления. Затем вызовите BindingOperations.GetBindingExpression(relevantControl, DependencyProperty)
в цикле для каждого свойства, чтобы вы могли проверить проверку.
3) В конструкторе вручную создайте коллекцию всех связанных свойств во вложенных элементах управления. В CanExecute выполните итерацию по этой коллекции и проверьте каждую комбинацию DependencyObject
/ DepencyProperty
, используя BindingOperation.GetBindingExpression()
для получения выражений, а затем изучив BindingExpression.HasError
.