我有一个带有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”,但同时我想允许按“取消”按钮。
答案 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。
无论哪种方式,您都可以从按钮中删除所有单击和鼠标按下处理程序。