完善主體資料,免費贈送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一区二区三区夜夜嗨| 国产综合视频在线观看一区| 国模精品一区二区三区视频 | 国产婷婷色一区二区三区| 中文字幕人妻AV一区二区| 无码精品一区二区三区| 国产日韩精品一区二区在线观看| 国产主播在线一区| 精品国产一区二区麻豆| 国产乱码一区二区三区四| 久久一区二区三区精品| 日本一区二区免费看| 国模无码一区二区三区不卡| 无码精品人妻一区二区三区影院 | 69福利视频一区二区| 果冻传媒董小宛一区二区| 亚洲av午夜精品一区二区三区| 亚洲av永久无码一区二区三区| 久久精品一区二区三区AV| 91精品国产一区二区三区左线| 亚洲乱码国产一区三区| 精品国产一区二区三区免费| 中文字幕精品一区| 国产一区二区精品尤物| 亚洲综合av永久无码精品一区二区 | 丝袜无码一区二区三区| 日韩精品无码一区二区三区AV | 老熟妇仑乱视频一区二区| 亚洲一区中文字幕久久| 日本激情一区二区三区| 亚洲一区精彩视频| 国产福利一区视频| 麻豆一区二区三区蜜桃免费| 日本人真淫视频一区二区三区| 免费观看日本污污ww网站一区| 国产日韩AV免费无码一区二区三区| 高清一区二区三区| 午夜精品一区二区三区免费视频| 一区二区三区四区精品视频| 精品人妻一区二区三区浪潮在线| 亚洲日韩国产欧美一区二区三区|