完善主體資料,免費贈送VIP會員!
      * 主體類型
      * 企業名稱
      * 信用代碼
      * 所在行業
      * 企業規模
      * 所在職位
      * 姓名
      * 所在行業
      * 學歷
      * 工作性質
      請先選擇行業
      您還可以選擇以下福利:
      行業福利,領完即止!

      下載app免費領取會員

      NULL

      ad.jpg

      二次開發教程:WPF通過異常來驗證用戶輸入

      發布于:2019-08-23 17:04:40

      網友投稿

      更多

      在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>

      本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

      未標題-1.jpg

      上一篇:二次開發教程:Revit開發之調用Revit命令的另一種方法

      下一篇:二次開發教程:Revit開發之多線程

      主站蜘蛛池模板: 国产精品无码AV一区二区三区| 97se色综合一区二区二区| 中文字幕人妻无码一区二区三区| 无码精品久久一区二区三区| 中文字幕一区二区视频| 亚洲国产av一区二区三区丶| 国产在线一区二区视频| 国产一区二区福利| 国产伦精品一区二区三区在线观看| 一区二区高清视频在线观看| 日本午夜精品一区二区三区电影| 伊人色综合网一区二区三区 | 东京热无码av一区二区| 国产乱人伦精品一区二区在线观看| 国偷自产视频一区二区久| 亚洲AV无码一区二区乱孑伦AS| 无码人妻久久一区二区三区蜜桃 | 日韩欧国产精品一区综合无码| 变态调教一区二区三区| 色狠狠色噜噜Av天堂一区| 久久国产午夜一区二区福利| 亚洲av永久无码一区二区三区| 国产品无码一区二区三区在线| 少妇无码AV无码一区| 国产精品亚洲一区二区三区在线| 日韩精品一区二区午夜成人版| 免费视频精品一区二区| 精品一区狼人国产在线| 国产免费私拍一区二区三区| 日本v片免费一区二区三区| 日韩一区二区精品观看| 日韩AV无码一区二区三区不卡| 国产一区二区三区在线电影| 一区二区福利视频| 亚洲一区二区三区无码中文字幕| 美女一区二区三区| 亚洲AV无码一区二区乱子仑 | 无码人妻少妇色欲AV一区二区| 免费看AV毛片一区二区三区| 亚洲AV无码一区二三区| 亚洲综合一区二区|