如何从 XAML 初始化数组类型的可绑定 属性

How to initialise a bindable property of type Array from XAML



在自定义组件中,我定义了一个 ARRAY 类型的可绑定 属性:

public static BindableProperty LabelsProperty = BindableProperty.Create(nameof(LabelStrings), typeof(string[]), typeof(BLSelector), null, BindingMode.Default, propertyChanged: OnLabelsPropertyChanged);
public string[] LabelStrings
{
    get => (string[])GetValue(LabelsProperty);
    set => SetValue(LabelsProperty, value);
}
private static void OnLabelsPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
    var current = bindable as BLSelector;

    // Check the number of strings
    if (current.Commands != null && current.LabelStrings.Count() != current.Commands.Count())
    {
        Debug.WriteLine("Component::BLSelector - Bad number of Labels");
        throw new TargetParameterCountException();
    }

    // Updates the number of Label Controls
    current.LabelControls = new Label[current.LabelStrings.Count()];

    // Set up the layout
    current.GridContendUpdate();
}

我想使用 XAML 文件中的这个组件,因此设置 属性 如下:

        <components:BLSelector>
            <components:BLSelector.LabelStrings>
                <x:Array Type="{x:Type x:String}">
                    <x:String>"           Activités            "</x:String>
                    <x:String>"          Prestations           "</x:String>
                </x:Array>
            </components:BLSelector.LabelStrings>
        </components:BLSelector>

当我启动该应用程序时,该应用程序在没有消息的情况下崩溃(由于空引用?)。如果在 setter 上放置一个断点,我可以看到它永远不会被调用。
但是......如果我在组件的构造函数中添加一个“内部”初始化,如下所示,setter 被调用两次(来自内部声明和 XAML 文件的数据 -这是正常的)并且应用程序不会崩溃。

public BLSelector()
{
    InitializeComponent();

    LabelStrings = new string[2]{ "Test 1", "Test 2" };
}

如果我只将 属性 分配给 XAML 文件中定义的数组,为什么应用程序会崩溃? XAML 中数组的真实类型是什么?是否存在初始化问题?任何的想法 ?

非常感谢您的建议

The naming convention for bindable properties is that the bindable property identifier must match the property name specified in the Create method, with "Property" appended to it. So try to change your bindable property name:

public static BindableProperty LabelStringsProperty = BindableProperty.Create(nameof(LabelStrings), typeof(string[]), typeof(BLSelector), null, BindingMode.Default, propertyChanged: OnLabelsPropertyChanged);