Как разрешить нажатие только кнопки отмены, когда значение недействительно? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть простой диалог с SpinEdit и двумя кнопками: OK_Button и Cancel_Button.Я установил маску для значения в SpinEdit, и диалоговое окно не позволит мне нажать кнопку отмены, когда значение недопустимо.Я попытался изменить свойство SpinEdit на InvalidValueBehavior = "AllowLeaveEditor", но затем я могу нажать оба, ОК и кнопку отмены.Есть ли способ разрешить ТОЛЬКО нажатие кнопки "Отмена", если значение неверно?

XAML:

 <dxe:SpinEdit x:Name="dxSpinEdit" 
               Height="23" MinWidth="200" Width="Auto"
               HorizontalAlignment="Right"
               Text="{Binding Value, Mode=TwoWay}"
               MaskType="Numeric"
               IsFloatValue="{Binding FloatValue}"
               MinValue="{Binding MinValue}"
               MaxValue="{Binding MaxValue}"
               Mask="{Binding Mask, Mode=OneWay}" 
               MaxLength="{Binding Path=InputLength}"
               MaskShowPlaceHolders="{Binding ShowPlaceHolder}"
               InvalidValueBehavior="WaitForValidValue"
     />

  <StackPanel Grid.Row="1" x:Uid="OKCancel_Buttons" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Bottom">
     <Button Height="23" x:Name="OK_Button" Click="OK_Click" Content="OK" IsDefault="True" HorizontalAlignment="Right" MinWidth="95" />
     <Button Height="23" x:Name="Cancel_Button" Click="Cancel_Click" Content="Cancel" HorizontalAlignment="Right" MinWidth="95" PreviewMouseDown="win_PreviewMouseDown" />
  </StackPanel>

Я посмотрел эту проблему на форуме devexpress, но их решение не помогло мне,Я реализовал событие MouseDownPreview следующим образом:

C # (код позади)

  private void OK_Click(object sender, RoutedEventArgs e)
  {
     DialogResult = true;
     Close();
  }

  private void Cancel_Click(object sender, RoutedEventArgs e)
  {
     DialogResult = false;
     Close();
  }

  private void win_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
  {
     if(e.Source == Cancel_Button)
     {
        DialogResult = false;
        Close();
     }
  }

Но событие вообще не было обработано.Я бы хотел сохранить свойство InvalidValueBehavior со значением «WaitForValidValue», но в то же время хотел бы разрешить нажатие кнопки «Отмена».

1 Ответ

0 голосов
/ 16 ноября 2018

Даже если вы не собираетесь идти по полному маршруту MVVM, вам следует переключиться с использования событий click на реализацию ICommand, которая поддерживает логику CanExecute (например, этот из MVVM Light).

Использование команды автоматически отключит любой связанный элемент управления (например, кнопку или элемент меню), когда CanExecute имеет значение false. Затем вы можете иметь всю логику для управления вашими командами, сгруппированными в одном месте, включая проверку, которая позволит нажимать кнопку ОК только тогда, когда ваш объект находится в допустимом состоянии.

Если вы просто хотите пойти по стандартному маршруту WPF (не MVVM), вы можете добавить что-то вроде этого в конструктор вашего окна

public MyView()
{
    ....


    Ok_Button.Command = 
        new RelayCommand(() => DialogResult = true, // just setting DialogResult is sufficient, no need to call Close()
                         // put the required validation logic here  
                         () => dxSpinEdit.Value > 0 && dxSpinEdit.Value < 10);

    Cancel_Button.Command = new RelayCommand(() => DialogResult = false);

    // replace this with the actual event from SpinEdit
    dxSpinEdit.ValueChanged += (s,e) => (OK_Button.Command as RelayCommand).RaiseCanExecuteChanged();
}

Да, я знаю, это выглядит ужасно & # x1f600; - Я бы предложил следовать шаблону проектирования MVVM вместо этого. При использовании MVVM все функциональные возможности команды принадлежат вашей ViewModel.

В любом случае, вы можете удалить все обработчики щелчков и mousedown из ваших кнопок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...