我有一个自定义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类型。现在设计师正确存储更改的列表。 感谢。
答案 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类型。现在设计师正确存储更改的列表。感谢。