2

我创建了两个自定义控件。1. LeafControl 2- LeafItemControl。在 LeafControl 中,我创建了一个“列表”类型的依赖属性作为“项目”。

  • 同样在 LeafItemControl 中,我公开了另一个依赖属性,称为 ContentControl 类型的“ItemDetails”。

    <!---Base Custom Control "LeafControl"-->
    


         <uc:LeafControlItem.ItemDetails> <!--"ItemDetails" is a Dependency Property of type "LeafControl" in "LeafControlItem" custom control -->
            <uc:LeafControl> <!--Nested Control of same type ???-->
            <uc:LeafControl.Items>
             <uc:LeafControlItem Level="Some Type">
                <uc:LeafControlItem.ItemContent>
                    <GroupBox BorderThickness="0">
                       <StackPanel Orientation="Horizontal">
                        <TextBox Text="Property"></TextBox>
                        </StackPanel>
                    </GroupBox>
                </uc:LeafControlItem.ItemContent> 
    
                </uc:LeafControlItem>
                <uc:LeafControlItem Level="Variable">
                  <uc:LeafControlItem.ItemContent>
                                        <GroupBox BorderThickness="0">
                                            <StackPanel Orientation="Horizontal">
                                                <TextBox Text="Ellipse2.Top"></TextBox>
                                            </StackPanel>
                                        </GroupBox>
                                    </uc:LeafControlItem.ItemContent>
                                </uc:LeafControlItem>
                            </uc:LeafControl.Items>
                        </uc:LeafControl>  
                    </uc:LeafControlItem.ItemDetails>
                </uc:LeafControlItem>
    

当我尝试访问基本自定义控件中的“项目”时。所有子自定义控件都被添加为什么?我应该怎么做才能使每个自定义控件对象(基础和子对象)都有单独的“项目”。

我在基本自定义控件中使用了依赖属性,如下所示:

 #region LeafControlItemCollection 

        public List<LeafControlItem> Items
        {
            get { return (List<LeafControlItem>)GetValue(ItemsProperty); }
            set { SetValue(ItemsProperty, value); }
        }

        public static readonly DependencyProperty ItemsProperty =
          DependencyProperty.Register(
              "Items", typeof(List<LeafControlItem>), typeof(LeafControl),
              new FrameworkPropertyMetadata(new List<LeafControlItem>(), null, null)
            ); 
#endregion

请建议我在哪里做错了。

4

1 回答 1

3

问题在于依赖属性标识符的声明,即ItemsProperty. 您提供了一个default value as new List<LeafControlItem>(). 通过这样做,您已经创建了一个singleton instance for your list秘密。

在这里阅读它,它描述了与您在列表 DP 的默认初始化中遇到的完全相同的问题。从该链接引用 -

如果您的属性是引用类型,则依赖属性元数据中指定的默认值不是每个实例的默认值;相反,它是适用于该类型的所有实例的默认值。因此,您必须注意不要将集合属性元数据定义的单一静态集合用作新创建的类型实例的工作默认值。相反,您必须确保故意将集合值设置为唯一(实例)集合,作为类构造函数逻辑的一部分。否则,您将创建一个无意的单例类。

将默认值指定为new List<LeafControlItem>(),使 的所有实例LeafControl共享同一个列表实例。因此,该列表中对象的任何添加和删除都将反映在 LeafControl 的所有实例中。所以,实际上你在这里为 LeafControl 的所有实例创建了单例列表。

首先,您应该避免在默认值中指定新列表 -

public static readonly DependencyProperty ItemsProperty =
          DependencyProperty.Register(
              "Items", typeof(List<LeafControlItem>), typeof(LeafControl)); 

其次,您应该通过在 ListControl 类的构造函数中设置它来将其初始化为新列表,以便每个实例都有自己的列表份额 -

public LeafControl()
{
   SetValue(ItemsPropertyKey, new List<LeafControlItem>()); 
}
于 2013-11-03T18:23:51.510 回答