我想允许用户只输入由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;
}
}
上面的代码有效。但是如果我能找到一种方法来检查新值是否有效而不更新绑定目标,那么它会更简单,并且不易出错。有吗?
答案 0 :(得分:0)
我认为在这种情况下,在Binding Converters上转发更容易。
每次将数据分配给绑定字段时,都会调用converter
。
在它的内部方法中,您可以验证数据的输入并基于验证结果返回或旧数据(导致验证失败)从ModelView
恢复或接受它,以防验证成功。
希望这有帮助。