我的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>
答案 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();
}
}
}