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)和一个按钮组成:

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

为什么?

4

1 回答 1

1

好的,我找到了答案。这是装饰层的问题。我们的 WPF 专家已经遇到过它并提供了一些解决方案。请参阅Karl Shifflett 的帖子

于 2009-01-03T22:06:39.967 回答