C# 如何在自定义WPF控件中初始化集合属性
我有一个自定义WPF控件基类。这个基类用类型“List”注册一个自定义属性 如何为设计时初始化属性?列表中应该始终有8个对象,用户应该能够修改这些对象 我试图通过PropertyMetadata对象传递默认值,但属性编辑器中显示的集合始终为空C# 如何在自定义WPF控件中初始化集合属性,c#,wpf,data-binding,wpf-controls,C#,Wpf,Data Binding,Wpf Controls,我有一个自定义WPF控件基类。这个基类用类型“List”注册一个自定义属性 如何为设计时初始化属性?列表中应该始终有8个对象,用户应该能够修改这些对象 我试图通过PropertyMetadata对象传递默认值,但属性编辑器中显示的集合始终为空 public class CustomPropertyTestBase : UserControl { static CustomPropertyTestBase() { List<object> defaul
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;
}
}
公共类CustomPropertyTestBase:UserControl
{
静态CustomPropertyTestBase()
{
列表默认值=新列表(新对象[8]);
MyCustomObjectsProperty=DependencyProperty.Register(“MyCustomObjects”,
typeof(列表),typeof(CustomPropertyTestBase),
新的PropertyMetadata(defaultValue));
}
公共静态依赖属性MyCustomObjectsProperty;
[类别(“MyCustomProperties”)]
公共列表MyCustomObjects
{
得到;
设置
}
}
编辑:
无论何时在属性编辑器中添加新对象,都不会存储这些新对象。重新打开属性编辑器后,列表再次为空
我已将调试器附加到设计器,并且编辑器从未调用该属性的get或set方法
解决方案:
正如“dowhilefor”提到的那样。我必须更改ObservableCollection的类型。现在,设计器将正确存储更改的列表。
谢谢。像这样的方法应该可以:
public MainWindow()
{
InitializeComponent();
if( System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
MyCustomObjects = new List<object>();
MyCustomObjects.Add("Hello");
}
}
public主窗口()
{
初始化组件();
if(System.ComponentModel.DesignerProperties.GetIsInDesignMode(此))
{
MyCustomObjects=新列表();
MyCustomObjects.Add(“Hello”);
}
}
但也许这不是最好的解决办法。我记得在expression blend中有一些工具使用虚拟数据,但我不记得它们是如何做到的。当然,这是静态的,您无法更改它,但我认为这是不可能的。当您需要在设计时显示示例数据时,不应该在C代码中硬编码示例数据 相反,请使用属性
d:DesignData
和支持的示例数据*.xaml文件在设计器中显示示例数据。这篇文章展示了如何做到这一点
下面是关于DesignData的另一篇好文章:
请注意,DesignData不仅适用于Blend,还适用于Visual Studio。如“dowhilefor”所述。我必须更改ObservableCollection的类型。现在,设计器将正确存储更改的列表。谢谢。您的用户控件实例(即单例)的列表是否相同?如果没有,请使用
newpropertymeta(null)
而不是newpropertymetata(defaultValue)
,并在公共构造函数中,使用MyCustomObjects=new List(…)
。我已经尝试过这一点,并将调试器附加到设计器中。调用构造函数并正确填充列表,但属性编辑器显示空列表。编辑器从未调用属性get或set方法。没错,WPF不使用这些getter和setter。你刚刚写的得到;设置我希望这只是为了简化,而不是您的实际代码,因为这是错误的。此外,您可能需要检查ObservableCollection是否更适合您的需要,如果您需要在列表中添加或删除活动更新。