【问题标题】:How to validate a value without updating the binding target?如何在不更新绑定目标的情况下验证值?
【发布时间】:2012-03-15 17:29:53
【问题描述】:

我想让用户只输入通过 TextBox 绑定验证规则验证的文本。我想出了一个办法:

public static void PreviewTextChanged(
    object sender,
    PreviewTextChangedEventArgs e)
{
    var textBox = e.Source as TextBox;
    var bindingExpression = textBox.GetBindingExpression(TextBox.TextProperty);
    if (!ReferenceEquals(null, bindingExpression))
    {
        // save original parameters for possible restoration
        var originalSelectionStart = textBox.SelectionStart;
        var originalSelectionLength = textBox.SelectionLength;
        var originalText = textBox.Text;

        // check validation
        textBox.Text = e.Text;
        if (!bindingExpression.ValidateWithoutUpdate())
        {
            // restore original values
            textBox.Text = originalText;
            bindingExpression.UpdateSource();
            textBox.SelectionStart = originalSelectionStart;
            textBox.SelectionLength = originalSelectionLength;
        }
        else
        {
            // correct the selection
            var selectionStart = originalSelectionStart +
                originalSelectionLength +
                e.Text.Length -
                originalText.Length;
            textBox.SelectionStart = Math.Max(selectionStart, 0);
            textBox.SelectionLength = 0;
        }

        e.Handled = true;
    }
}

上面的代码有效。但是,如果我能找到一种方法来检查新值是否有效而不更新绑定目标,它会简单得多,而且不易出错。有吗?

【问题讨论】:

    标签: c# .net wpf validation binding


    【解决方案1】:

    我认为在这种情况下转发Binding Converters 会更容易。 每次应将数据分配给绑定字段时,都会调用converter。 在它的内部方法中,您可以验证数据的输入,并根据验证结果返回或从ModelView 恢复的旧数据(导致验证失败)或接受它,以防验证成功。

    希望这会有所帮助。

    【讨论】:

    • 我理解你的想法,但是如何从转换器内部访问旧数据?
    • “旧”数据是尚未受 UI 上应用的更改影响的数据。正确的 ?因此,在您的ModelView 中,您有一个在 UI 上可视化的数据。用户更改了绑定字段上的某些内容。那么应该发生什么,它改变了在ModelView 关联属性上设置的值。但是 之前发生了转换器调用。转换器的返回值将是分配给ModelView 的值,也将是分配给UI 的值。因此,如果您在该点进行验证,您就可以控制在 UIModelView 层之间传递的值。
    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多