为什么在设置DataContext时没有运行我的验证规则?

时间:2009-07-16 13:27:54

标签: c# .net wpf validation datacontext

我的Window上有以下Loaded事件:

void Window_Loaded(object sender, RoutedEventArgs e) {
    this.DataContext = new MyObject() {
        MyDateTime = DateTime.Now,
        MyNotEmptyString = "Not Empty",
        MyNotUpperCaseString = "not upper case",
        MyInteger = 20,
        MyIntegerInRange = 1,
        MyDouble = 4.56
    };
}

对于上面初始化的每个属性,我有一个绑定到它的TextBox,每个属性都有自己的与之关联的验证规则。

问题是,我的验证规则在第一次设置this.DataContext时没有运行,但在正常使用表单时运行良好(它们在TextBox失去焦点时运行) 。这背后的原因是什么?我尝试设置UpdateSourceTrigger="PropertyChanged",但这没有帮助。

修改 以下是绑定到属性的TextBox的示例:

<TextBox Name="MyDoubleField">
    <TextBox.Text>
        <Binding Path="MyDouble">
            <Binding.ValidationRules>
                <local:TextIsDouble/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

3 个答案:

答案 0 :(得分:3)

“为什么”部分的答案很简单:这是设计的。验证通常适用于用户输入,不用于验证存储的数据。

我认为基本问题是:如何在设置上下文后手动激活验证。我不确定,但是WPF窗口可能有WinForms Validate()方法。

答案 1 :(得分:0)

您的验证不在您的数据类中是否有原因?使用IDataErrorInfo应立即验证数据,然后将其冒充到您的UI,而无需执行任何额外操作。

我说应该,因为这对我们有用,但我们不使用WPF。

答案 2 :(得分:0)

设置DataContext时未运行Validations的原因是WPF仅在使用目标值更新源时运行验证(AKA,文本框已更改且源相应更新)。

如果要在设置DataContext时验证数据,则必须迭代逻辑树,并且对于要运行验证的每个元素,您需要获取其BindingExpression然后调用绑定表达式UpdateSource方法。这将迫使验证。

执行类似操作的代码将是:

    private void ValidateData()
    {            
        //The XAML file defines a group of TextBox elements inside a Grid called grd
        foreach (UIElement uie in grd.Children)
        {
            if (uie.GetType() == typeof(TextBox))
            {
                ((TextBox)uie).GetBindingExpression(TextBox.TextProperty).UpdateSource();          
            }
        }                    
    }