2

我有一个自定义 WPF 控件基类。这个基类注册了一个类型为“List<”some own type">“的自定义属性。

如何在设计时初始化属性?列表中应该始终有 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 的类型。现在设计器正确地存储了更改的列表。谢谢。

4

3 回答 3

2

当您需要在设计时显示示例数据时,您不应在 C# 代码中对示例数据进行硬编码。

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

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

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

于 2012-06-27T11:32:42.160 回答
1

像这样的东西应该工作:

public MainWindow()
    {
        InitializeComponent();

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

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

于 2012-06-27T10:54:41.000 回答
1

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

于 2012-06-27T12:02:54.317 回答