Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在自定义WPF控件中初始化集合属性_C#_Wpf_Data Binding_Wpf Controls - Fatal编程技术网

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

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

我有一个自定义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;
    }
}
公共类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是否更适合您的需要,如果您需要在列表中添加或删除活动更新。