Xamarin.Forms:如何为自定义控件管理“嵌入式” BindableProperties?

时间:2018-07-11 14:30:48

标签: xamarin.forms properties binding controls

我尝试为 Xamarin.Forms 创建一个自定义条目控件,其中包含:

  • 表示字段类型的 SVG图标
  • 自定义条目控件
  • SVG图标,允许用户清除条目

对于 SVG图标,我使用基于AlexPshul解决方案的控件,该控件使用 SkiaSharp 将svg转换为图标。源代码控件看起来像this

此控件使用了BindableProperty

public static readonly BindableProperty ResourceIdProperty = BindableProperty.Create(
    nameof(ResourceId), typeof(string), typeof(SvgIcon), default(string), propertyChanged: RedrawCanvas);

public string ResourceId
{
    get => (string)GetValue(ResourceIdProperty);
    set => SetValue(ResourceIdProperty, value);
}

根据Alex Dunn的解决方案,我还使用了自定义条目允许删除边框:

public class BorderlessEntry : Entry
{
    public BorderlessEntry()
    {
    }
}

然后控件在iOS和Android上使用自定义渲染器

我想创建这样的自定义控件:

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             x:Class="CustomEntries.CustomEntry"
             xmlns:cust="clr-namespace:CustomEntries">
    <StackLayout Orientation="Horizontal" BackgroundColor="White">
        <cust:SvgIcon x:Name="embeddedSvgIcon" WidthRequest="20" HeightRequest="20" 
                      HorizontalOptions="Center" VerticalOptions="Center"/>
        <cust:BorderlessEntry x:Name="embeddedBorderlessEntry" Placeholder="Name or surname" HorizontalOptions="FillAndExpand"  />
        <cust:SvgIcon ResourceId="CustomEntry.times_circle.svg" WidthRequest="20" HeightRequest="20" 
             HorizontalOptions="Center" VerticalOptions="Center" />           
    </StackLayout>
</ContentView>

我可以在页面上“复制”该控件,并为每个控件指定属性,效果很好:

Custom entries

但是我想通过引用一个通用控件并指定BindableProperties来正确实现它。

而且我看不到如何将该公共控件的BindableProperties传输到“子级”控件(SvgIcon,BorderlessControl):

  • SvgIcon 控件的 ResourceId
  • 无边框控件控件的属性占位符 IsPassword 文本绑定

有可能吗?有什么更好的方法来实现这一目标?

0 个答案:

没有答案