值无效时,如何只允许按取消按钮?

时间:2018-11-16 08:09:22

标签: c# wpf devexpress

我有一个带有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 :(得分:1)

即使您不打算走完整的MVVM路线,也应该从使用单击事件切换到支持CanExecute逻辑的ICommand实现(例如MVVM Light的this one)。

如果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();
}

是的,我知道它看起来很丑?-我建议改用MVVM设计模式。使用MVVM时,所有命令功能都属于ViewModel。

无论哪种方式,您都可以从按钮中删除所有单击和鼠标按下处理程序。