如何在另一个字段的值更改时在一个字段上显示错误
How to display an error on a field when the value of another field changes
我有一个带有对话框的 WPF 应用程序,允许用户编辑对象的设置。我为此对话框使用 MVVM。此对话框的我的视图模型对象实现了 IDataErrorInfo
接口。
表单上的一个字段是 ComboBox
,它映射到作为枚举的视图模型对象的 属性。表单上还有其他字段,其验证逻辑取决于绑定到 ComboBox
.
的字段的值
单独地,当输入不同字段的值时,它们会验证并且对话框会显示正确的错误状态。也就是说,当您创建一个新对象并编辑表单以指定与默认值不同的值时,每个控件的错误状态都会正确显示。我的问题是,当您编辑现有对象并更改 ComboBox
中的选定值时,在对话框下方出现的字段中指定的值可能无效,但错误状态不是正在显示。
这是当您更改 ComboBox
的选定值时运行的代码:
private void TypePicker_SelectionChanged( object sender, SelectionChangedEventArgs e ) {
IsDirty = true;
MyCommands.SaveChanges.CanExecute( this, OkButton );
e.Handled = true;
}
MyCommands
是一个class;命令是 class 的静态属性。 IsDirty 是属于对话框的 bool DependencyProperty
。
当我更改 ComboBox
中的选定值时,如何让其他字段生效?
我找到了一种方法来完成这项工作。它更像是一种蛮力技术,但它确实有效。
我添加了代码以将依赖字段的 TextBox
控件的值设置为其当前值。这会引发这些控件的 TextChanged
事件,导致与它们关联的属性重新生效并显示错误情况。例如,
private void TypePicker_SelectionChanged( object sender, SelectionChangedEventArgs e ) {
IsDirty = true;
FirstDependentTextBox.Text = ViewModelObject.Property1;
SecondDependentTextBox.Text = ViewModelObject.Property2;
MyCommands.SaveChanges.CanExecute( this, OkButton );
e.Handled = true;
}
这行得通。我对此并不满意,因为似乎应该有一种更优雅的方法来做同样的事情,但它确实有效,而且我现在正在使用它。
我有一个带有对话框的 WPF 应用程序,允许用户编辑对象的设置。我为此对话框使用 MVVM。此对话框的我的视图模型对象实现了 IDataErrorInfo
接口。
表单上的一个字段是 ComboBox
,它映射到作为枚举的视图模型对象的 属性。表单上还有其他字段,其验证逻辑取决于绑定到 ComboBox
.
单独地,当输入不同字段的值时,它们会验证并且对话框会显示正确的错误状态。也就是说,当您创建一个新对象并编辑表单以指定与默认值不同的值时,每个控件的错误状态都会正确显示。我的问题是,当您编辑现有对象并更改 ComboBox
中的选定值时,在对话框下方出现的字段中指定的值可能无效,但错误状态不是正在显示。
这是当您更改 ComboBox
的选定值时运行的代码:
private void TypePicker_SelectionChanged( object sender, SelectionChangedEventArgs e ) {
IsDirty = true;
MyCommands.SaveChanges.CanExecute( this, OkButton );
e.Handled = true;
}
MyCommands
是一个class;命令是 class 的静态属性。 IsDirty 是属于对话框的 bool DependencyProperty
。
当我更改 ComboBox
中的选定值时,如何让其他字段生效?
我找到了一种方法来完成这项工作。它更像是一种蛮力技术,但它确实有效。
我添加了代码以将依赖字段的 TextBox
控件的值设置为其当前值。这会引发这些控件的 TextChanged
事件,导致与它们关联的属性重新生效并显示错误情况。例如,
private void TypePicker_SelectionChanged( object sender, SelectionChangedEventArgs e ) {
IsDirty = true;
FirstDependentTextBox.Text = ViewModelObject.Property1;
SecondDependentTextBox.Text = ViewModelObject.Property2;
MyCommands.SaveChanges.CanExecute( this, OkButton );
e.Handled = true;
}
这行得通。我对此并不满意,因为似乎应该有一种更优雅的方法来做同样的事情,但它确实有效,而且我现在正在使用它。