代码之家  ›  专栏  ›  技术社区  ›  Betty Crokker

Xamarin Forms XAML-创建没有UI的自定义控件?

  •  2
  • Betty Crokker  · 技术社区  · 6 年前

    假设我想在XAML中定义一些数据,然后在同一XAML中的多个位置使用这些数据,如下所示:

    <custom:Definition Identifier="MyTemplate">
       <custom:Data Value="3" />
       <custom:Data Value="6" />
       <custom:Data Value="12" />
    </custom:Definition>
    
    <custom:Control Template="MyTemplate" />
    <custom:Control Template="MyTemplate" />
    <custom:Control Template="MyTemplate" />
    

    所以“模板”对象根本不会显示在UI中,它只是数据。我想我可以定义一个从元素派生的对象,如下所示:

    [ContentProperty("Content")]
    public class Definition : Element
    {
        public static readonly BindableProperty ContentProperty = BindableProperty.Create(nameof(Content), typeof(List<object), typeof(Definition), null);
        public List<object> Content { get; set; }
        public string Identifier {get; set; }
    }
    

    但当我这样做时,XAML抱怨“没有为‘内容’找到属性、可绑定属性或事件,或者值和属性之间的类型不匹配”。

    无论我为“Content”属性的类型输入了什么,也不管我在标记内的XAML中输入了什么(即使定义标记没有子项),我总是会收到相同的错误消息。

    如何将非UI元素添加到XAML?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Diego Rafael Souza    6 年前

    您的可绑定属性不应设置为如下所示?

    [ContentProperty("Content")]
    public class Definition : Element
    {
        public static readonly BindableProperty ContentProperty = BindableProperty.Create(nameof(Content), typeof(List<object>), typeof(Definition), null);
        public List<object> Content 
        { 
            get { return (List<object>)GetValue(ContentProperty); } 
            set { SetValue(ContentProperty, value); }
        }
        public string Identifier {get; set; }
    
        public Definition()
        {
            Content = new List<object>();
        }
    }
    

    我喜欢你的目标。对于许多应用程序来说,它是非常可重用的。

    您的类的注入如图所示:

    Class injection on the Element's class hierarchy