2012-01-12 6 views
2

ちょうどWPFを始め、特にTextBoxのエントリの検証を始めています。WPFの基本的な確認

これは私のXAMLである: -

<Window x:Class="WpfTestBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Height="350" 
     Width="525" 
     Loaded="OnInit"> 
    <Grid> 
     <Button Content="OK" Height="23" HorizontalAlignment="Left" Margin="235,164,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
     <TextBox Height="23" HorizontalAlignment="Left" Margin="206,108,0,0"     
       Name="textBox1" VerticalAlignment="Top" Width="120" > 
      <TextBox.Text> 
       <Binding Path="Description" UpdateSourceTrigger="LostFocus" > 
        <Binding.ValidationRules> 
         <ExceptionValidationRule /> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 
    </Grid> 
</Window> 

これは私のバインディングコードです: -

namespace WpfTestBinding 
{ 
    class MyDataItem 
    { 
     private String _description; 
     public String Description 
     { 
      get { return _description; } 
      set 
      { 
       _description = value; 

       Debug.WriteLine("Setting description ="+value); 

       if (String.IsNullOrEmpty(value)) 
       { 
        throw new ApplicationException("Description is mandatory."); 
       }         
      } 
     } 
    } 
} 

と、これは私のバッキングコードです: - 私が選択した場合

まず
using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows; 

    namespace WpfTestBinding 
    { 
     /// <summary> 
     /// Interaction logic for MainWindow.xaml 
     /// </summary> 
     public partial class MainWindow : Window 
     { 
      public MainWindow() 
      { 
       InitializeComponent(); 
      } 

      private void OnInit(object sender, RoutedEventArgs e) 
      { 
       this.DataContext = new MyDataItem(); 
      } 

      private void button1_Click(object sender, RoutedEventArgs e) 
      { 
       Debug.WriteLine("Button clicked."); 
      } 
     } 
    } 

テキストボックスとそのタブから何も起こりません、私は "記述は必須"例外がスローされると思いますか? 次に、テキストボックスに何かを入力してすぐに削除し、タブを押すと例外がスローされますか? この例外は処理されず、未処理の例外エラーが発生します。

答えて

2

最初に例外を検証しないでください。例外は、プログラムフローで何か例外が発生したことを示し、エラーを表示するように設計されています。

は、WPFの検証が第二

をどのように動作するかの明確なexplinationためData Validation in 3.5を参照してください、あなたは、単にテキストボックスに入力し、離れるとき、あなたがそれを見ていない理由は、あなたが実際に値を更新していないことですバウンドプロパティ。値を入力して削除すると、その値が更新されます。

+0

1は、あなたが投稿したリンクは、それが検証に使用するバインディング書くために最も一般的な方法のより良い例を持っていました – Rachel

1

ネットの周りを掘り進んだり、MSのドキュメントを読んだりして、私が望むものを見つけました。 あなたができることは、 'LostKeyboardFocus'属性があなた自身の何らかの方法を指すように設定することです。ここで、テキストボックスのフォーカスが失われると、 'TextBoxLostKeyboardFocus()'メソッドが呼び出されます。 `テキスト=「{バインディングの説明、ValidatesOnDataError =真}」`:私が望むものの

<TextBox Height="23" HorizontalAlignment="Left" Margin="206,108,0,0"     
      Name="textBox1" 
      LostKeyboardFocus="TextBoxLostKeyboardFocus" 
      VerticalAlignment="Top" Width="120" > 
     <TextBox.Text> 
      <Binding Path="Description" 
         UpdateSourceTrigger="LostFocus" 
         ValidatesOnDataErrors="True" 
         NotifyOnSourceUpdated="True"       
         Mode="TwoWay"> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
関連する問題