2012-08-22 2 views
1

Я хочу иметь IsEnabled кнопки щелкните кнопку, чтобы быть только верно, если два Textboxes не имеют каких-либо ошибок (в данном случае, я просто хочу, чтобы они оба числовая)Создание кнопки IsEnabled состояния зависит от двух текстовых

Я попытался установить текстовые поля NotifyOnValidationError = True, думая, что это вызовет исключение, которое пузырится до элемента управления контейнером - я бы установил значение IsEnabled для кнопки true на основании свойства прикрепленного свойства Validation.HasError, принадлежащего этому элементу управления

I попробовал следующее (лишен кода форматирования), но он не работает (кнопка включена, когда я впервые запускаю приложение, а текстовые поля пустые - они привязаны к десятичным знакам с нулевым значением)

<WrapPanel> 
    <TextBox x:Name="txtDeltaMin"Text="{Binding Path=DeltaMinFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"></TextBox> 
    <TextBox x:Name="txtDeltaMax" Text="{Binding Path=DeltaMaxFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"></TextBox> 
    <Button x:Name="btnUpdateFilter" Click="btnUpdateFilter_Click" IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type WrapPanel}}, Path=(Validation.HasError)}">Filter</Button> 
</WrapPanel> 

ответ

3

Вы можете использовать MultiBinding. Должно выглядеть примерно так:

<TextBox Text="{Binding Path=DeltaMinFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" /> 
<TextBox x:Name="txtDeltaMax" Text="{Binding Path=DeltaMaxFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" /> 
<Button x:Name="btnUpdateFilter" Click="btnUpdateFilter_Click" Content="Filter"> 
    <Button.IsEnabled> 
     <MultiBinding Converter="{StaticResource IsEnabledConverter}"> 
      <Binding ElementName="txtDeltaMin" Path="Validation.HasError" /> 
      <Binding ElementName="txtDeltaMax" Path="Validation.HasError" /> 
     </MultiBinding> 
    </Button.IsEnabled> 
</Button> 

Тогда вам просто нужно сделать IsEnabledConverter класс по реализации IMultiValueConverter, и добавить его в качестве ресурса.

public class IsEnabledConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     foreach (var isValid in values) 
      if (isValid as bool? == false) 
       return false; 
     return true; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Как добавить его в качестве ресурса? – Mike

1

Вы также можете создать CommandBinding, как описано в этом MSDN article, а затем использовать CanExecuteHandler Включение/отключение кнопки, установив CanExecute.

От второго звена:

Как правило, источник команд, такой MenuItem, будет вызывать метод CanExecute на RoutedCommand, чтобы определить, если команда может или не может выполнить на целевой текущей команды. Если для параметра CanExecute установлено значение false из обработчика события, источник команды отключится. Например, если MenuItem выступает в качестве источника команды для команды, и команда не может выполнить текущую целевую команду, то MenuItem будет серой.

Смежные вопросы