WPF验证不会在TextBox的第一个LostFocus上触发

aza*_*arp 13 validation wpf focus

我试图针对一个对象验证WPF表单.当我在文本框中键入内容时,验证会激活,失去焦点会回到文本框,然后删除我写的任何内容.但是,如果我只是从文本框中加载WPF应用程序和选项卡而不从文本框中写入和删除任何内容,那么它就不会被触发.

这是Customer.cs类:

public class Customer : IDataErrorInfo
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public string Error
        {
            get { throw new NotImplementedException(); }
        }
        public string this[string columnName]
        {
            get
            {
                string result = null;

                if (columnName.Equals("FirstName"))
                {
                    if (String.IsNullOrEmpty(FirstName))
                    {
                        result = "FirstName cannot be null or empty"; 
                    }
                }
                else if (columnName.Equals("LastName"))
                {
                    if (String.IsNullOrEmpty(LastName))
                    {
                        result = "LastName cannot be null or empty"; 
                    }
                }
                return result;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是WPF代码:

<TextBlock Grid.Row="1" Margin="10" Grid.Column="0">LastName</TextBlock>
<TextBox Style="{StaticResource textBoxStyle}" Name="txtLastName" Margin="10"
         VerticalAlignment="Top" Grid.Row="1" Grid.Column="1">
    <Binding Source="{StaticResource CustomerKey}" Path="LastName"
             ValidatesOnExceptions="True" ValidatesOnDataErrors="True"
             UpdateSourceTrigger="LostFocus"/>         
</TextBox>
Run Code Online (Sandbox Code Playgroud)

Ber*_*rmo 18

如果你不想在你的代码中添加一些逻辑,你可以用这样的方式处理实际的LostFocus事件:

的.xaml

<TextBox LostFocus="TextBox_LostFocus" ....
Run Code Online (Sandbox Code Playgroud)

.xaml.cs

private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
     ((Control)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
Run Code Online (Sandbox Code Playgroud)


小智 8

不幸的是,这是设计上的.仅当控件中的值发生更改时,才会触发WPF验证.

难以置信,但却是如此.到目前为止,WPF验证是一个很大的谚语 - 它很可怕.

但是,您可以做的一件事是从控件的属性中获取绑定表达式并手动调用验证.它很糟糕,但它确实有效.


w4g*_*n3r 5

看一下ValidationRule 的ValidatesOnTargetUpdated属性.它将验证何时首次加载数据.如果您尝试捕获空字段或空字段,这很好.

你会像这样更新你的绑定元素:

<Binding 
    Source="{StaticResource CustomerKey}" 
    Path="LastName" 
    ValidatesOnExceptions="True" 
    ValidatesOnDataErrors="True" 
    UpdateSourceTrigger="LostFocus">
    <Binding.ValidationRules>
        <DataErrorValidationRule
            ValidatesOnTargetUpdated="True" />
    </Binding.ValidationRules>
</Binding>
Run Code Online (Sandbox Code Playgroud)