如何在自定义WPF控件中初始化集合属性

时间:2012-06-27 10:33:09

标签: c# wpf data-binding wpf-controls

我有一个自定义WPF控件基类。此基类注册一个自定义属性,类型为“List<”某些类型为“>”。

如何在设计时初始化属性?列表中应始终有8个对象,用户应该能够修改此对象。

我尝试使用PropertyMetadata对象传递默认值,但属性编辑器中显示的集合始终为空。

public class CustomPropertyTestBase : UserControl
{

    static CustomPropertyTestBase()
    {
        List<object> defaultValue = new List<object>(new object[8]);
        MyCustomObjectsProperty = DependencyProperty.Register("MyCustomObjects",
            typeof(List<object>), typeof(CustomPropertyTestBase),
            new PropertyMetadata(defaultValue));
    }

    public static DependencyProperty MyCustomObjectsProperty;

    [Category("MyCustomProperties")]
    public List<object> MyCustomObjects
    {
        get;
        set;
    }
}

编辑:

每当我在属性编辑器中添加新对象时,都不会存储这些新对象。重新打开属性编辑器后,列表再次为空。

我已将调试器附加到设计器,并且编辑器从不调用属性的get或set方法。

解决方案:

正如“dowhilefor”所提到的那样。我不得不改变ObservableCollection类型。现在设计师正确存储更改的列表。 感谢。

3 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

public MainWindow()
    {
        InitializeComponent();

        if( System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
        {
            MyCustomObjects = new List<object>();
            MyCustomObjects.Add("Hello");
        }
    }

但也许它不是最好的解决方案。我记得表达式混合中有一些工具有虚拟数据,但不记得他们是如何做到的。当然这是静态的,你不能改变它,但我不认为这是可能的。

答案 1 :(得分:1)

如果需要显示设计时的样本数据,则不应在C#代码中对样本数据进行硬编码。

相反,使用属性d:DesignData和支持示例数据* .xaml文件来显示设计器中的示例数据。文章Design-time Attributes展示了如何做到这一点。

这是关于DesignData的另一篇好文章:DesignData MVVM support in Blend, VS2010 and ...

请注意,DesignData不仅适用于Blend,也适用于Visual Studio。

答案 2 :(得分:1)

正如“dowhilefor”所提到的那样。我不得不改变ObservableCollection类型。现在设计师正确存储更改的列表。感谢。