2009-01-03 1 views
1

Система проверки WPF выполняет внутреннюю проверку объекта (я имею в виду - все поля проверяются, когда элемент привязки данных изменяется, а результаты отображаются на ui). Но это не работает, когда я добавляю управление динамически. В этом случае происходит inital валидация, но результаты не отображаются на 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, поле Name проверяется немедленно, а уведомление об ошибке отображается с использованием шаблона ошибки проверки. Но когда MyCustomControl добавляется динамически (после нажатия кнопки, нажата кнопка), происходит первоначальная проверка, но ui не показывает результаты (без красной границы и т. Д.)

Предположим, что окно приложения состоит из док-панели (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.