Xamarin - 绑定到自定义控件内子控件的 属性

Xamarin - Binding to a Property of a child control inside a custom control

我正在开发 Xamarin 应用程序。我正在使用 Label 控件、DatePicker 控件和 Entry 控件制作自定义控件。我必须为自定义控件中的日期控件创建很多 BindableProperties,例如 MaximumDate、MinimumDate 属性 以及许多其他属性。据我了解,我必须在我的自定义控件中创建这些 Bindable属性 成员的原因是因为在视图上使用自定义控件时我无权访问子控件的属性。有没有办法访问嵌入在自定义控件中的子控件的属性?我可以节省大量定义 BindableProperties 及其 CLR 属性和其他内容的代码行。

这是我的自定义控件 XAML(为了使代码更具可读性和简洁性,我删除了发布代码中除 Label 元素之外的所有元素。

<StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="DPSReminders.Controls.CustomLabel"
         xmlns:controls="clr-namespace:DPSReminders.Controls"
         xmlns:sfLayout="clr-namespace:Syncfusion.XForms.TextInputLayout;assembly=Syncfusion.Core.XForms"
         xmlns:sfPicker="clr-namespace:Syncfusion.XForms.Pickers;assembly=Syncfusion.SfPicker.XForms"
         xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
         xmlns:fai="clr-namespace:FontAwesome">
<StackLayout.Resources>
    <ResourceDictionary>
    </ResourceDictionary>
</StackLayout.Resources>
<StackLayout Orientation="Horizontal" Margin="10">
    <Label x:Name="myLabel" 
            Text=""
            FontFamily="FASolid"
            VerticalOptions="Center"
            HorizontalOptions="Start"
            Margin="10">
    </Label>
</StackLayout>

文件背后的代码:

public class CustomLabel : StackLayout
{
public static readonly BindableProperty LabelTextProperty =
BindableProperty.Create(nameof(LabelText), typeof(string), typeof(CustomLabel),
    defaultBindingMode: BindingMode.TwoWay,
    propertyChanged: LabelTextPropertyChanged);

public string LabelText
{
    get => GetValue(LabelTextProperty)?.ToString();
    set => SetValue(LabelTextProperty, value);
}

private static void LabelTextPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
    var control = bindable as CustomLabel;
    control.myLabel.Text = newValue?.ToString();
}

public CustomLabel()
{
    InitializeComponent();
}
}

这是我尝试使用自定义控件的页面。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="DPSReminders.Views.DateTimeTest"
         xmlns:fai="clr-namespace:FontAwesome"
         xmlns:vm="clr-namespace:DPSReminders.ViewModels"
         xmlns:controls="clr-namespace:DPSReminders.Controls"
         xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
         >
    <controls:CustomLabel LabelText = "{Binding MyLabelText}"/>
</ContentPage>

我想知道我是否可以在我的标签中做这样的一行,这会让我的生活更轻松。

    <controls:CustomLabel:myLabel.Text = "{Binding MyLabelText}"/>

然后,当用于相同目的的内置可绑定 属性 在子控件中已经可用时,我可以删除创建 BindableProperties 和支持的 CLR 属性等的所有代码。这是我们能做的吗?

尝试改用模板。

Xamarin.Forms 控件模板使您能够定义 ContentView 派生自定义控件和 ContentPage 派生页面的视觉结构。控件模板将自定义控件或页面的用户界面 (UI) 与实现该控件或页面的逻辑分开。还可以在预定义位置将其他内容插入到模板化自定义控件或模板化页面中。

文档link: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/templates/control-template