zoukankan      html  css  js  c++  java
  • WPF通过异常来验证用户输入

    在WPF中使用数据绑定,如果用户输入和绑定类型转换失败,控件就会显示出现错误的模板,

    比如一个Textbox绑定到一个int 属性,如果用户输入一个string,那这个textbox就会显示错误模板,一般会是在TextBox外显示红线,

    当然这个模板也可以自己设置。那如果这个界面有一个确定Button,我想实现TextBox里输入非数字和数字值小于0时Button都不可用,

    那该怎么实现呢?

    namespace WpfApplication6
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = new ViewModel(this);
            }
        }
        public class ViewModel : INotifyPropertyChanged
        {
            private Window win = null;
            private int errors = 0;
            private int num1 = 0;
            public int Num1
            {
                get
                {
                    return num1;
                }
                set
                {
                    num1 = value;
                    if (num1 < 0)
                    {
                        throw new ArgumentException("值太小!");
                    }
                }
            }
            private int num2 = 0;
            public int Num2
            {
                get
                {
                    return num2;
                }
                set
                {
                    num2 = value;
                    if (num2 > 0)
                    {
                        throw new ArgumentException("值太大!");
                    }
                }
            }
            public ICommand OK_Command
            {
                get
                {
                    return new ReLayCommand(() => {


                    },()=> {
                        return errors == 0;
                    });
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
            private void OnRaisePropertyChanged(string name)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(name));
                }
            }
            public ViewModel(Window win)
            {
                this.win = win;
                Validation.AddErrorHandler(win, ErrorHandler);
            }


            private void ErrorHandler(object sender, ValidationErrorEventArgs e)
            {
                if (e.Action == ValidationErrorEventAction.Added)
                {
                    errors += 1;
                }
                if (e.Action == ValidationErrorEventAction.Removed)
                {
                    errors -= 1;
                }
                OnRaisePropertyChanged("OK_Command");
            }
        }
        public class ReLayCommand : ICommand
        {
            private Action _execute = null;
            private Func<bool> _canExecute = null;
            public event EventHandler CanExecuteChanged;
            public ReLayCommand(Action _execute, Func<bool> _canExecute = null)
            {
                this._execute = _execute;
                this._canExecute = _canExecute;
            }
            public bool CanExecute(object parameter)
            {
                if (_canExecute != null)
                    return _canExecute();
                return true;
            }
            public void Execute(object parameter)
            {
                if (_execute != null)
                    _execute();
            }
        }
    }

    <Window x:Class="WpfApplication6.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication6"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="TextBox">
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="true">
                        <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
        <Grid>
            <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="140,76,0,0" TextWrapping="Wrap" Text="{Binding Path=Num1,UpdateSourceTrigger=PropertyChanged,NotifyOnValidationError=True,ValidatesOnExceptions=True}" VerticalAlignment="Top" Width="120"/>
            <TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="23" Margin="140,160,0,0" TextWrapping="Wrap" Text="{Binding Path=Num2,UpdateSourceTrigger=PropertyChanged,NotifyOnValidationError=True,ValidatesOnExceptions=True}" VerticalAlignment="Top" Width="120"/>
            <Button x:Name="button" Command="{Binding Path=OK_Command}" Content="Button" HorizontalAlignment="Left" Margin="129,239,0,0" VerticalAlignment="Top" Width="75"/>
        </Grid>
    </Window>

  • 相关阅读:
    使用Jenkins进行android项目的自动构建(3)
    使用Jenkins进行android项目的自动构建(2)
    使用Jenkins进行android项目的自动构建(1)
    testlink 从1.8.5 升级到 1.9.8
    779. 第K个语法符号(Leetcode)
    687. 最长同值路径(Leetcode)(递归+树)
    116. 飞行员兄弟(Acwing)(递归+位运算)
    95. 费解的开关(Acwing)(分析+递推)
    Java遇到输入速度瓶颈时的解决办法
    92. 递归实现指数型枚举(Acwing)(递归)
  • 原文地址:https://www.cnblogs.com/sjqq/p/8486043.html
Copyright © 2011-2022 走看看