将第一个元素设置为x:Null(一个Xaml问题)

时间:2019-05-24 16:48:36

标签: xaml syntax

我为XAML控件创建了一个自定义Collection属性:

class MyClass : DependencyObject
{
    public ObservableCollection<object> MyCollection
    {
        get { return GetValue(MyCollectionProperty) as ObservableCollection<object>;}
        set { SetValue(MyCollectionProperty, value); }
    }
    public static readonly DependecyProperty MyCollectionProperty = 
        DependencyProperty.Register(nameof(MyCollection), typeof(ObservableCollection<object>), new PropertyMetadata(new ObservableCollection<object>()));
}

但是当我尝试在XAML中向其中添加元素时:

<local:MyClass
    *snip*>
    <local:MyClass.MyCollection>
        <x:Null/> // this causes a crash because it sets my collection to null
        <Button/>
        <x:Null/>
    </local:MyClass.MyCollection>
</local:MyClass>

我收到XamlParseException-“ ...属性已经设置...”,我认为发生的是解析器将上述代码解释为将整个集合设置为null的请求,然后尝试将其设置为按钮,然后将其设置为null。如果Button是第一个,那么Button和null会毫无问题地添加到我的默认列表中。

在XAML中将列表中的第一个元素设置为null的正确语法是什么? XAML Syntax in Detail的内容属性和集合语法组合部分是我发现的最有用的参考至今。我的猜测是,它将是某种标记扩展,但是我尝试过的所有操作都会产生相同的错误。

1 个答案:

答案 0 :(得分:0)

一个选择是从您的MyCollection属性中删除该设置器-如果没有可用的设置器,XAML解析器会将您的集合解释为一个隐式集合(不能设置 ,但是可以添加。)这意味着解析器不会将您的初始x:Null解释为null集合,而是将其添加到现有列表中。

来自XAML Syntax in Detail

  

隐式collection元素会在逻辑树表示形式中创建一个成员,即使它没有作为元素出现在标记中。通常,父类型的构造函数对其作为其属性之一的集合执行实例化,并且最初为空的集合成为对象树的一部分。