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();
}
爲什麼?