如何使本地ContentView绑定标签文本

问题描述 投票:0回答:1

我使用扩展器制作了ContentView。我想在另一个Xaml文件中多次重复此Xaml代码。但是我想为每个扩展器都设置不同的绑定。我链接了此代码(ContentView代码):

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:expandable="clr-namespace:Expandable;assembly=ExpandableView"
             x:Class="Hello.ExpandableView">
    <ContentView.Content>
        <expandable:ExpandableView Padding="5">
    <expandable:ExpandableView.PrimaryView>
        <Frame BackgroundColor="White" Padding="5" CornerRadius="10">
            <StackLayout Orientation="Horizontal">
        <Label x:Name="label" FontSize="16" TextColor="Black" FontAttributes="Bold" Padding="5" HorizontalTextAlignment="Start" HorizontalOptions="StartAndExpand"/>
        <Image Source="arrow.png" WidthRequest="25" HeightRequest="25" Margin="5"/>
                </StackLayout>
    </Frame>
    </expandable:ExpandableView.PrimaryView>
    <expandable:ExpandableView.SecondaryViewTemplate>
        <DataTemplate>
            <Frame BackgroundColor="White" Padding="5" CornerRadius="10">
        <Label Text="{Binding Tip1Uitleg}" FontSize="15" TextColor="Black" Padding="5"/>
                </Frame>
        </DataTemplate>
    </expandable:ExpandableView.SecondaryViewTemplate>
</expandable:ExpandableView>
    </ContentView.Content>
</ContentView>
namespace Hello
{
    public partial class ExpandableView : ContentView
    {
        public static BindableProperty LabelProperty =
    BindableProperty.Create(nameof(Label),
                            typeof(string),
                            typeof(ExpandableView),
                            propertyChanged: (b, o, n) => (b as ExpandableView).OnLabelChanged());

        private void OnLabelChanged()
        {
            label.Text = Label; //label is the x:Name of your Label control in ExpandableView.xaml
        }

        public string Label
        {
            get => (string)GetValue(LabelProperty);
            set => SetValue(LabelProperty, value);
        }
    }
}

至此代码:这有效:

<local:ExpandableView Label="Hello"/>

但是我想要这个。这不起作用:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:expandable="clr-namespace:Expandable;assembly=ExpandableView"
             xmlns:local="clr-namespace:Hello"
             x:Class="Hello.Health.HealthDetail"
             Title="{Binding Name}">
     <ContentPage.Content>
     <ScrollView>
        <StackLayout>
            <Image Source="{Binding Image}"/>
            <Label Text="{Binding Tip1Uitleg}" FontSize="15" TextColor="Black" Padding="10, 5, 10, 5"/>

            <local:ExpandableView Label="{Binding Tip1}"/> //This is what it is all about
</StackLayout>
            </ScrollView>
    </ContentPage.Content>
</ContentPage>

代码隐藏:

namespace Hello.Health
{
    public partial class HealthDetail : ContentPage
    {
        public HealthDetail(HealthStrings healthStrings)
        {
            if (healthStrings == null)
                throw new ArgumentNullException();

            BindingContext = healthStrings;

            InitializeComponent();


        }
    }
}

我如何进行这项工作?我必须使以上内容更加动态,但我不知道如何。

BTW这也有效:

<Label Text="{Binding Tip1}" />

抱歉,您的解释不清楚,希望有人能帮助我。谢谢您的时间:)

xamarin xamarin.forms binding label local
1个回答
0
投票

由于您使用的是BindableProperty,因此不应绑定到'this'。相反,当BindableProperty的值更改时,您应该更新Label.Text属性。

public static BindableProperty LabelProperty =
    BindableProperty.Create(nameof(Label),
                            typeof(string),
                            typeof(ExpandableView),
                            propertyChanged:(b, o, n) => (b as ExpandableView).OnLabelChanged());

private void OnLabelChanged()
{
    label.Text = Label; //label is the x:Name of your Label control in ExpandableView.xaml
}

public string Label
{
    get => (string)GetValue(LabelProperty);
    set => SetValue(LabelProperty, value);
}
<?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="YourProject.ExpandableView">
    <Grid>
        <Label x:Name="label"/>
    </Grid>
</ContentView>
© www.soinside.com 2019 - 2024. All rights reserved.