如何在不更新绑定目标的情况下验证值?

时间:2012-03-15 17:29:53

标签: c# .net wpf validation binding

我想允许用户只输入由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;
    }
}

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

1 个答案:

答案 0 :(得分:0)

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

希望这有帮助。