2009-07-07 8 views
0

У меня есть форма WinForms, содержащая элемент управления ElementHost (который содержит WPF UserControl) и кнопку «Сохранить».Проверка WPF в элементе управления ElementHost

В WPF UserControl У меня есть текстовое поле с некоторой проверкой на нем. Что-то вроде этого ...

<TextBox Name="txtSomething" ToolTip="{Binding ElementName=txtSomething, Path=(Validation.Errors).[0].ErrorContent}"> 
    <Binding NotifyOnValidationError="True" Path="Something"> 
     <Binding.ValidationRules> 
      <commonWPF:DecimalRangeRule Max="1" Min="0" /> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox> 

Это все работает нормально. Однако я хочу отключить кнопку «Сохранить», пока форма находится в недопустимом состоянии.

Любая помощь была бы принята с благодарностью.

ответ

0

Ну, наконец, я решил решение моей проблемы.

В элементе управления WPF я добавил это к событию Loaded.

Validation.AddErrorHandler(this.txtSomething, ValidateControl); 

Где ValidateControl выше, определяется, как это:

private void ValidateControl(object sender, ValidationErrorEventArgs args) 
{ 
    if (args.Action == ValidationErrorEventAction.Added) 
     OnValidated(false); 
    else 
     OnValidated(true); 
} 

Наконец я добавил мероприятие под названием Validated, который содержит IsValid логическое значение в его аргументов события. Тогда я смог подключить это событие в своей форме, чтобы сообщить ему, что элемент управления действителен или нет.

Если есть лучший способ, мне было бы интересно узнать.

1

Я думаю, что это должно помочь вам:

<UserControl Validation.Error="Validation_OnError > 
<UserControl.CommandBindings> 
    <CommandBinding Command="ApplicationCommands.Save" CanExecute="OnCanExecute" Executed="OnExecute"/> 
</UserControl.CommandBindings> 
... 
<Button Command="ApplicationCommands.Save" /> 
... 
</UserControl> 

/* put this in usercontrol's code behind */ 
int _errorCount = 0; 
private void Validation_OnError(object sender, ValidationErrorEventArgs e) 
{ 
    switch (e.Action) 
    { 
     case ValidationErrorEventAction.Added: 
      { _errorCount++; break; } 
     case ValidationErrorEventAction.Removed: 
      { _errorCount--; break; } 
    } 
} 

private void OnCanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = _errorCount == 0; 
} 

Тогда вы могли бы, возможно, сообщить MainForm об изменении с событием, зарегистрированное на UserControl.