指定的元素已经是另一个元素的逻辑子元素

时间:2016-07-20 08:57:34

标签: wpf invalidoperationexception

我希望这不会被标记为重复,因为我的问题有点复杂,所以没有其他答案有帮助。我有一个名为'ControlChoiceModule'的类,它根据它处理的属性类型生成一个System.Windows.Controls对象(String - TextBox,Boolean - CheckBox,DateTime - DatePicker等)。 它有两个词典:

public static class ControlChoiceModule
{

    private static readonly Dictionary<Type, object> TypeToControl = new Dictionary<Type, object>
    {
        {typeof(bool), new CheckBox() },
        {typeof(DateTime), new DatePicker() }

    };
    private static readonly Dictionary<Type, DependencyProperty> ControlToProperty = new Dictionary<Type, DependencyProperty>
    {
        {typeof(TextBox), TextBox.TextProperty },
        {typeof(CheckBox), CheckBox.IsCheckedProperty },
        {typeof(DatePicker), DatePicker.SelectedDateProperty }

    };

另一个的目的只是为了约束。以下是两种方法:

   public static object GenerateControl(Type theType, Binding B)
    {
        object O;
        if (TypeToControl.ContainsKey(theType))
        {
            O = TypeToControl[theType];
        }
        else
        {
            O = new TextBox();
        }

        SetBinding(O, B);
        return O;

    }

    private static void SetBinding(object O, Binding B)
    {
        BindingOperations.SetBinding(O as DependencyObject, ControlToProperty[O.GetType()], B);
    }

现在,所有这一切的目的是为某个类生成一个插入窗口,一般来说。因此,窗口循环遍历所有类的属性,并根据类型为其生成适当的字段。

   private void GenerateInsertionOrUpdatePage(string windowText)
    {
        var w2 = new InsertionWindow();
        w2.DataContext = this.DataContext;
        w2.Title = windowText;
        w2.Show();

            foreach (var P in ReturnPropertyList())
            {
                if (P.Name != "SearchableString" && P.Name != "Id" )
                {
                    Label L = new Label();
                    L.Content = P.Name + ":";
                    w2.InsertionStackPanel.Children.Add(L);

                    Binding B = new Binding();
                    B.Path = new PropertyPath("NewT." + P.Name);
                    B.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                    B.Mode = BindingMode.TwoWay;

                    **w2.InsertionStackPanel.Children.Add(ControlChoiceModule.GenerateControl(P.PropertyType, B) as UIElement);**

            }
            }
    }

点击按钮即可调用上述方法。我第一次点击它,它工作得很好。但是当我再次点击它时,我从标题中得到错误(在标有**的行上)。 知道为什么会这样吗? 感谢

0 个答案:

没有答案