项目在导航应用程序中添加两次

时间:2011-06-01 09:09:18

标签: c# .net silverlight silverlight-4.0 navigation

我有一个自定义的Silverlight(4)控件,与数据网格不同。此控件具有名为ColumnConfiguration的属性。在导航应用程序中使用此控件时,ColumnConfiguration会再次添加其项目(通过XAML),同时保留其旧列,结果是将正常数量的列添加到控件的两倍。

public ColumnCollection ColumnConfiguration
{
    get { return (ColumnCollection)GetValue(ColumnConfigurationProperty); }
    set { SetValue(ColumnConfigurationProperty, value); }
}

public class ColumnCollection : Collection<ColumnBase> { }

如何防止这些列再次添加到控件中?

Xaml是这样的:

<my:Control.ColumnConfiguration>
<my:ColumnTypeA Width="*" MinWidth="50">
</my:ColumnTypeA>
<my:ColumnTypeB Width="2*" MinWidth="50">

</my:ColumnTypeB>
<my:ColumnTypeB Width="2*" MinWidth="50">

</my:ColumnTypeB>
<my:ColumnTypeB Width="*" MinWidth="50">

</my:ColumnTypeB>
<my:ColumnTypeB Width="2*" MinWidth="50">

</my:ColumnTypeB>
</my:Control.ColumnConfiguration>

1 个答案:

答案 0 :(得分:2)

您是否在DependencyProperty UIPropertyMetaData中提供了默认值?由于DependencyProperty是静态的,因此指定的默认值对于控件的所有实例都是相同的(引用)。使用值类型时这是无害的,但是当您的属性是引用类型时,您必须使用控件的.ctor()(或任何其他实例方式)设置其初始值,以便创建单独的初始值

我想你在应用程序中有两次实例化这个控件,假设使用MVVM DataTemplate?第一个实例将向使用默认值创建的静态ColumnCollection添加列,而secod也将再次使用此实例。

您可以通过查看ColumnCollection的默认ToString()值来验证这一点,它将包含引用的哈希值。

要解决此问题,只需将ColumnConfigurationProperty的默认值设置为null。