0

我正在开发 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 属性等的所有代码。这是我们能做的吗?

4

1 回答 1

1

尝试改用模板。

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

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

于 2021-12-17T01:28:10.820 回答