我正在开发 Xamarin 应用程序。我正在使用 Label 控件、DatePicker 控件和 Entry 控件制作自定义控件。我必须为自定义控件中的日期控件创建很多 BindableProperties,例如 MaximumDate、MinimumDate 属性以及许多其他属性。据我了解,我必须在自定义控件中创建这些 BindableProperty 成员的原因是因为在视图上使用自定义控件时我无法访问子控件的属性。有没有办法访问嵌入在自定义控件中的子控件的属性?我可以节省大量定义 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 属性等的所有代码。这是我们能做的吗?