WPF验证系统执行对象的初始验证(我的意思是 - 在更改数据绑定项时验证所有字段,并在ui上显示结果)。 但是,当我动态添加控件时,它不会像这样工作。在这种情况下,会发生初始验证,但结果未显示在ui上。只有在数据绑定对象上的某些属性发生更改后,一切才能正常工作。这是一个粗略的样本。
假设我们有MyObject类
public class MyObject : INotifyPropertyChanged, IDataErrorInfo
{
public string Name { /*get, set implementation */}
// IDataErrorInfo
public string this[string columnName]
{
get
{
if (String.IsNullOrEmpty(Name)) return "Name can't be empty!";
return String.Empty;
}
}
/* etc. */
}
一些用户控件,比如MyUserControl,允许编辑MyObject对象。 它可以看起来像这样:
<UserControl x:Class="Test.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name: "/>
<TextBox Text="{Binding Name, ValidatesOnDataErrors=True}" Width="200"/>
</StackPanel>
</UserControl>
现在,当将此控件添加到xaml中的主窗口(或构造函数或窗口加载事件中的代码中)时,将MyCustomControl.DataContext设置为MyObject类的新实例时,将立即验证名称字段使用验证错误模板显示错误通知。但是当动态添加MyCustomControl时(例如,点击按钮后),初始验证会发生,但是ui不会显示结果(没有红色边框等)。
假设应用程序窗口包含dockpanel(dockPanel)和按钮:
public Window1()
{
InitializeComponent();
button.Click +=new RoutedEventHandler(OnButtonClick);
/*
// in this case validation works correctly,
// when window is shown Name textbox already got a red border etc.
var muc = new MyUserControl();
dockPanel.Children.Add(muc);
muc.DataContext = new MyObject();
*/
}
private void OnButtonClick(object sender, RoutedEventArgs e)
{
// in this case validatation works, but no results are shown on the ui
// only after Name property is changed (then removed again) red border appears
var muc = new MyUserControl();
dockPanel.Children.Add(muc);
muc.DataContext = new MyObject();
}
为什么?