Первоначальная проверка динамически добавленного элемента управления - PullRequest
1 голос
/ 03 января 2009

Система проверки WPF выполняет первоначальную проверку объекта (я имею в виду - все поля проверяются при изменении элемента, связанного с данными, и результаты отображаются в пользовательском интерфейсе). Но это не работает, когда я добавляю элемент управления динамически. В этом случае происходит первоначальная проверка, но результаты не отображаются в интерфейсе пользователя. Только после изменения некоторых свойств объекта с привязкой к данным все начинает работать правильно. Вот сырой образец.

Предположим, у нас есть класс 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 добавляется динамически (например, после нажатия кнопки), происходит первоначальная проверка, но пользовательский интерфейс не показывает результаты (без красной рамки и т. Д.)

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

1 голос
/ 04 января 2009

Хорошо, я нашел какой-то ответ. Это проблема с рекламным слоем. Наши гуру WPF уже сталкивались с этим и предоставили какое-то решение. См. Сообщение Карла Шиффлетта .

...