C# 不更新数据源的WPF验证

C# 不更新数据源的WPF验证,c#,wpf,validation,converter,C#,Wpf,Validation,Converter,我有一个文本框,显示日期时间的时间部分: <TextBox HorizontalAlignment="Left" Height="23" Margin="0,13,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Validation.Error="Validation_OnError"> <TextBox.Text> <Binding Path="MyDate" Str

我有一个文本框,显示日期时间的时间部分:

<TextBox HorizontalAlignment="Left" Height="23" Margin="0,13,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Validation.Error="Validation_OnError">
    <TextBox.Text>
        <Binding Path="MyDate" StringFormat="HH:mm" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <c:TimeValidator></c:TimeValidator>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

是否可以对属性更改进行验证,并对失去焦点进行转换


我想更改对属性的验证,但我想在失去焦点时更新数据源。否则,当用户在文本框中编辑时,转换器将启动。如果值为
10:50
,并且用户删除了最后一个数字,因此该值变为
10:5
,则可能会出现问题。然后转换器将其转换为
10:50
。在失去焦点时可以这样做,但在改变属性时不能这样做。但是为了验证程序,我想在属性更改时进行验证,这样只要输入的值无效,用户就会有红色边框。

是!我只是在努力解决这个问题。好了,没有XAML组合——它必须在codebehind中完成,并且您需要直接引用元素

Element.GetBindingExpression(PropertyName).ValidateWithoutUpdate();
您可能需要检查GetBindingExpression是否不返回null;这将运行您连接的任何转换器(可能是为了向ValidationStep设置为ConvertedProposedValue的转换器提供转换后的值),但不会更新源。当然,在某些情况下,你不得不称之为TextChanged或诸如此类。以下是它的MSDN文档:

使用此代码:

    BindingExpression expression = 
    txtStudentName.GetBindingExpression(TextBox.TextProperty);
    expression.ValidateWithoutUpdate();
    BindingExpression expression = 
    txtStudentName.GetBindingExpression(TextBox.TextProperty);
    expression.ValidateWithoutUpdate();
    if (expression!=null && !expression.HasError)
    expression.UpdateSource();
如果要在选中后更新其源代码,请使用以下代码:

    BindingExpression expression = 
    txtStudentName.GetBindingExpression(TextBox.TextProperty);
    expression.ValidateWithoutUpdate();
    BindingExpression expression = 
    txtStudentName.GetBindingExpression(TextBox.TextProperty);
    expression.ValidateWithoutUpdate();
    if (expression!=null && !expression.HasError)
    expression.UpdateSource();

当控件焦点丢失时,您正在使用的绑定类型应该有效地更新属性。您可以在MyData属性设置器中编写转换代码,以正确设置属性。调用PropertyChanged后,控件应显示正确的结果。不是这样吗?请记住绑定MyDate是一个DateTime结构。如果将UpdateSourceTrigger设置为PropertyChanged(正如我在上一节中尝试描述的),则使用StringFormat的标准转换无法正常工作。但为了“实时验证”,我想更改PropertyChange上的触发器。但我想这是没有办法有不同的触发器进行验证和源代码更新。请提供一些重要的信息从链接位。这个链接将来可能会断开。你对@AkshayHazari有什么建议吗?除了复制整个MSDN文档,我无法想象我还会添加什么。事实上,这种联系本身更像是事后才想到的。