如何定义可从Xaml访问的构造函数参数

时间:2017-09-13 03:10:19

标签: c# xamarin xamarin.forms

Xamarin的ListView定义了一个1参数构造函数,如下所示:

public ListView([Parameter("CachingStrategy")] ListViewCachingStrategy cachingStrategy)

因此,可以在Xaml中使用CachingStrategy

<ListView CachingStrategy="RecycleElement" .../>

我想知道我怎么能做同样的事情。以下代码不会编译,因为ParameterAttribute是Xamarin.Forms的内部代码:

public ItemListControl([Parameter("IsReadOnly")] bool isReadOnly)

我从Xamarin.Forms复制了类ParameterAttribute,以及上面的编译,但对Xaml处理没有影响。这是课程,供参考:

[AttributeUsage(AttributeTargets.Parameter)]
internal sealed class ParameterAttribute : Attribute
{
    public ParameterAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; }
}

我有什么遗漏吗?

1 个答案:

答案 0 :(得分:2)

为简化起见,我建议为IsReadOnly创建BindableProperty。但是你总是可以使用x:Arguments将参数传递给构造函数:

<local:ItemListControl ...>
    <x:Arguments>
        <x:Boolean>true</x:Boolean>
    </x:Arguments>
</local:ItemListControl>

编辑 - 1

你可以使用一个hack - (我不建议这样做,因为这可以在XAMLC编译中change anytime with an update) - 但你可以确保命名空间与定义时的内部命名空间相同参数属性。

namespace Xamarin.Forms
{
    [AttributeUsage(AttributeTargets.Parameter)]
    internal sealed class ParameterAttribute : Attribute
    {
        public ParameterAttribute(string name)
        {
            Name = name;
        }

        public string Name { get; }
    }
}

XAML的用法如下:

<local:ItemListControl IsReadOnly="true" .. />

编辑 - 2 如果将XAMLCompilation应用于主机控件/页面,则此hack似乎才有效。