我刚刚开始使用WPF,特别是验证TextBox中的条目。
这是我的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.");
}
}
}
首先,如果我选择文本框和选项卡没有任何反应,我会期望抛出“描述是必需的”异常吗? 如果我然后在文本框中输入内容并立即删除它,然后按Tab键抛出异常? 然后,此异常未处理,我收到未处理的异常错误。
答案 0 :(得分:2)
首先,您不会使用异常进行验证,异常旨在指示程序流中发生异常并提供错误。
请参阅Data Validation in 3.5,了解WPF验证的工作原理
其次,当您只是进入和离开TextBox时,您没有看到它的原因是您实际上并未更新绑定属性的值。当您输入值然后将其删除时,您正在更新该值。
答案 1 :(得分:1)
经过大量挖掘网络和阅读MS文档后,我找到了我想要的东西。 您可以做的是将“LostKeyboardFocus”属性设置为指向您自己的某种方法,例如:当文本框失去焦点时,调用方法'TextBoxLostKeyboardFocus()'。
<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>