WPF验证而不更新数据源

时间:2014-10-14 14:33:44

标签: c# wpf validation converter

我有一个TextBox显示DateTime的时间部分:

<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>

是否可以对属性更改进行验证,以及丢失焦点的转换?

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

2 个答案:

答案 0 :(得分:2)

是的!我只是在努力解决这个问题。 AFAIK,没有XAML组合 - 它必须在代码隐藏中完成,你需要直接引用该元素。

Element.GetBindingExpression(PropertyName).ValidateWithoutUpdate();

您可能想要检查GetBindingExpression是否不返回null;此运行您附加的任何转换器(可能是为了将转换后的值提供给ValidationStep设置为ConvertedProposedValue的转换器),但不会更新源。而且,当然,你必须在某些情况下调用它,也许是TextChanged或者其他一些东西。以下是MSDN文档:https://msdn.microsoft.com/en-us/library/system.windows.data.bindingexpressionbase.validatewithoutupdate(v=vs.110).aspx

答案 1 :(得分:0)

使用此代码:

    BindingExpression expression = 
    txtStudentName.GetBindingExpression(TextBox.TextProperty);
    expression.ValidateWithoutUpdate();

如果要在检查后更新其源,请使用以下代码:

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