WPF / XAML:将元素添加到类型列表的依赖项属性中

时间:2019-05-24 13:14:43

标签: c# wpf xaml

我想要的是一个可以保存某些内容列表的依赖项属性。如果没有元素,则列表不应为空,但依赖项属性应为null。

这是定义:

public List<Element> Elements {
  get { return (List<Element>)GetValue(ElementsProperty); }
  set { SetValue(ElementsProperty, value); }
}

public static readonly DependencyProperty ElementsProperty =
    DependencyProperty.Register("Elements", typeof(List<Element>), typeof(ParameterControl), new PropertyMetadata(null));

添加元素时...

<controls:Knob.Elements>
    <controls:Element Position="50,0" Text="j"/>
</controls:Knob.Elements>

...我得到这个例外。

System.Windows.Markup.XamlParseException: ... "Elements" ist NULL.

如果我将“ new PropertyMetadata(null)”替换为“ new PropertyMetadata(new List())”,则它可以正常工作。但是在这种情况下,如果没有元素,则depencency属性不为null。

1 个答案:

答案 0 :(得分:1)

  

如果我将“ new PropertyMetadata(null)”替换为“ new PropertyMetadata(new List())”,则它可以正常工作。

然后,默认列表将在控件的所有实例之间共享。如果要使用默认列表,则应在构造函数中初始化List<Element>

public class ParameterControl : Control
{
    public ParameterControl()
    {
        Elements = new List<Element>();
    }

    public List<Element> Elements
    {
        get { return (List<Element>)GetValue(ElementsProperty); }
        set { SetValue(ElementsProperty, value); }
    }

    public static readonly DependencyProperty ElementsProperty =
        DependencyProperty.Register("Elements", typeof(List<Element>), typeof(ParameterControl), new PropertyMetadata(null));

}

这是在WPF中实现大多数集合依赖属性的方式,即它们总是返回一个可能为空的实际集合对象。