验证错误导致绑定不更新

时间:2013-07-11 20:12:10

标签: c# .net wpf xaml

我正在涉足WPF并注意到我以前从未见过的特殊性。在下面的示例中,我有两个文本框绑定到代码隐藏中的相同DP。

代码隐藏:

public partial class MainWindow : Window
{
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(Window), new FrameworkPropertyMetadata("Hello"));

    public MainWindow()
    {
        InitializeComponent();
    }


}

和XAML:

    <TextBox>
        <TextBox.Text>
            <Binding RelativeSource = "{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="Text" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                <Binding.ValidationRules>
                    <utils:RestrictInputValidator Restriction="IntegersOnly" ValidatesOnTargetUpdated="True"/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <TextBox Name="TextBox" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Mode=TwoWay, Path=Text, UpdateSourceTrigger=PropertyChanged}"/>

我注意到当我在包含IntegerOnly验证的TextBox中输入一些未通过验证的东西时(在这种情况下,任何不是整数的东西),底层的Text变量都不会更新。 这是默认行为吗?为什么这样做?是否可以覆盖?

Error example

1 个答案:

答案 0 :(得分:0)

将ValidationRule的ValidationStep设置为CommitedValue,它将在将值提交到源(msdn)后运行验证。

<utils:RestrictInputValidator Restriction="IntegersOnly" ValidationStep="CommitedValue" ValidatesOnTargetUpdated="True"/>

编辑: 将validationstep设置为CommitedValue或UpdatedValue时,BindingExpression将发送到Validate方法而不是实际值。我不知道是否有另一种方法来获取BindingExpression的值,但是我做了一个扩展方法来获取它:

public static class BindingExtensions
{
    public static T Evaluate<T>(this BindingExpression bindingExpr)
    {
        Type resolvedType = bindingExpr.ResolvedSource.GetType();
        PropertyInfo prop = resolvedType.GetProperty(
            bindingExpr.ResolvedSourcePropertyName);
        return (T)prop.GetValue(bindingExpr.ResolvedSource);
    }
}