Кнопка отключения при ошибке проверки - PullRequest
18 голосов
/ 28 июня 2011

У меня есть пара текстовых полей с пользовательскими валидаторами:
(Я не возражаю, если «неправильные» данные отправляются обратно на объект (свойство является строкой), мне просто нужно запретить функциональность кнопки в случае ошибки, поэтому, если привязка не подходит для этого вид проверки, пожалуйста, скажите. Мне просто нравится поддержка Validation.ErrorTemplate, которую я могу использовать)

<ControlTemplate x:Key="validator" >
    <DockPanel LastChildFill="True">
       <TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="12pt">!</TextBlock>
       <Border BorderBrush="Red" BorderThickness="1.0">
            <AdornedElementPlaceholder />
       </Border>
    </DockPanel>
</ControlTemplate>

<TextBox Height="23" Width="150"  TextWrapping="Wrap"
         Validation.ErrorTemplate="{StaticResource validator}">
         <TextBox.Text>
            <Binding Path="StringProperty" UpdateSourceTrigger="LostFocus">
               <Binding.ValidationRules>
                   <local:NumbersOnly/>
               </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
</TextBox>

Как отключить определенную кнопку, если возникла какая-либо ошибка проверки?

<Button Content="DO Work"  Height="57" HorizontalAlignment="Left"  Name="button1" VerticalAlignment="Top" Width="234" Click="button1_Click" />

Ответы [ 5 ]

47 голосов
/ 02 мая 2013

Вы можете использовать MultiDataTrigger свойство в Style.Triggers из Button. Давайте предположим, что у нас есть TextBox с именем "txtName". Мы должны отключить кнопку "btnSave" при ошибке проверки TextBox.

Вот что вы можете сделать:

<Button Content="Save" 
        Grid.Column="1"
        Grid.Row="3"
        HorizontalAlignment="Right"
        Height="23" 
        Name="btnSave" 
        Width="75"
        IsDefault="True"
        Command="{Binding SaveProtocolCommand}"
        Margin="3">
  <Button.Style>
    <Style TargetType="Button">
      <Setter Property="IsEnabled" Value="False"/>
      <Style.Triggers>
        <MultiDataTrigger>
          <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding Path=(Validation.HasError), ElementName=txtName}" Value="False"/>
          </MultiDataTrigger.Conditions>
          <Setter Property="IsEnabled" Value="True"/>
        </MultiDataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>

Надеюсь, это поможет вам.

5 голосов
/ 27 сентября 2015

CanExecute в MVVM для управления авторизацией, но люди используют его для проверки.Лучший способ - это сделать в XAML.Вам понадобится конвертер, если у вас есть несколько полей для проверки (InverseAndBooleansToBooleanConverter - моя реализация для нескольких логических значений).Вот как это сделать:

код XAML (извините, если код XAML действительно появляется, потому что я мог его отобразить, даже если попытался):

<Button Name="Button_Test" Content="Test">
    <Button.IsEnabled>
        <MultiBinding Converter="{StaticResource InverseAndBooleansToBooleanConverter}" Mode="TwoWay">
            <Binding ElementName="TextBox_Field1" Path="(Validation.HasError)" />
            <Binding ElementName="TextBox_Field2" Path="(Validation.HasError)" />
            <Binding ElementName="TextBox_Field3" Path="(Validation.HasError)" />
        </MultiBinding>
    </Button.IsEnabled>
</Button>

Преобразователь

public class InverseAndBooleansToBooleanConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values.LongLength > 0)
        {
            foreach (var value in values)
            {
                if (value is bool && (bool)value)
                {
                    return false;
                }
             }
        }    
        return true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
            throw new NotImplementedException();
    }
}
3 голосов
/ 19 мая 2016

Добавьте это в свой текстовый блок:

Validation.Error="Save_Error"

CodeBehind (xaml.cs):

public partial class MyView : Window
{
    private int _noOfErrorsOnScreen = 0;

    public MyView()
    {
        InitializeComponent();
    }


    private void Save_Error(object sender, ValidationErrorEventArgs e)
    {
        if (e.Action == ValidationErrorEventAction.Added)
            _noOfErrorsOnScreen++;
        else
            _noOfErrorsOnScreen--;

        Save.IsEnabled = _noOfErrorsOnScreen > 0 ? false : true;

    }
}
0 голосов
/ 17 апреля 2014

Если вы используете MVVM, просто реализуйте метод CanExecute интерфейса ICommand. Кнопка не отключается, когда команда CanExecute имеет значение false

Если вы пишете свою логику в codebehind, просто используйте свойство кнопки IsEnabled:

xaml:

<Button Name=_btn/>

SomeForm.xaml.cs:

_btn.IsEnabled=false;
0 голосов
/ 28 июня 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...