2009-01-03 52 views
1

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(); 
     } 

爲什麼?

回答

1

好吧,我找到了一種答案。這是adorner圖層的問題。 我們的WPF大師已經遇到它並提供了一些解決方案。 見Karl Shifflett's post