【问题标题】:WPF validation without updating the data source不更新数据源的 WPF 验证
【发布时间】:2014-12-09 09:41:35
【问题描述】:

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

<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。在失去焦点时可以这样做,但在属性改变时则不行。但是为了验证器,我想验证属性更改,因此只要输入的值无效,用户就有红色边框。

【问题讨论】:

  • 您使用的绑定类型应该在失去控制焦点时有效地更新属性。您可以在正确设置属性的 MyData 属性设置器中编写转换代码。调用 PropertyChanged 后,您的控件应显示正确的结果。不是这样吗?
  • 请注意绑定 MyDate 是一个 DateTime 结构。如果将 UpdateSourceTrigger 设置为 PropertyChanged(正如我在上一节中试图描述的那样),则使用 StringFormat 的标准转换效果不佳。但为了“实时验证”,我想在 PropertyChanged 上有触发器。但我想验证和源更新没有不同的触发器。

标签: c# wpf validation converter


【解决方案1】:

是的!我只是在为此苦苦挣扎。 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

【讨论】:

  • 请务必从链接中提供一些重要信息。该链接将来可能会损坏。
  • 您对@AkshayHazari 有什么建议吗?除了复制整个 MSDN 文档之外,我无法想象我还要添加什么。事实上,链接本身更像是事后才想到的。
【解决方案2】:

使用此代码:

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

如果您想在检查后更新它的源代码,请使用此代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2010-10-10
    • 2015-03-20
    • 2020-03-03
    • 2015-12-31
    相关资源
    最近更新 更多