上动态添加控制初始验证(Initial validation on dynamically adde

2019-09-27 11:38发布

WPF验证系统执行的对象的INTIAL validatation(我的意思 - 当数据绑定项目被改变的所有字段进行验证,并且结果被显示在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来类的新实例相比,名称字段将立即验证和错误通知使用验证错误模板显示。 但是,当MyCustomControl动态添加(后说,按钮被点击),初步验证情况,但用户界面不显示结果(无红色边框等等)

假设应用程序窗口由一个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(); 
        }

为什么?

Answer 1:

好吧,我发现了一种答案的。 这是与装饰器层的问题。 我们WPF大师已经遇到了它,并提供了一些解决方案。 见卡尔Shifflett的帖子 。



文章来源: Initial validation on dynamically added control