如何将控件的内容绑定到 XAML 中 VIEW 类型的 属性

How to bind the content of a control to a property of type VIEW in XAML

我想为我的应用程序制作一个通用设置页面。我有一个不同类型的设置列表,每一个都对应以下界面:

public interface ISettings
{
    string SectionLabel { get; }

    View SectionView  { get; }
}

每种类型的设置代表应用程序设置的给定方面或部分。目标是使每种类型的设置都可以定义自己的外观以及调整自己的值的方式。

我有一个包含所有设置列表的设置页面: public 列出 settingSections { get => App.AppSettings.SettingsSections; }

在XAML设置页面,我想这样显示:

<StackLayout BindableLayout.ItemsSource="{Binding settingsSections, Source={x:Reference this}}" Padding="0" BackgroundColor="White">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            <xct:Expander>
                <xct:Expander.Header>
                    <StackLayout Orientation="Horizontal">
                        <Image Source="{Helpers:ImageResource Images.filledDownArrow.png}" HeightRequest="{Binding Source={x:Reference heightRef}, Path=Height, Converter={Helpers:IntMultiplier Multiplier=0.99}}"
                            HorizontalOptions="Start"
                            VerticalOptions="Center">
                            <Image.Triggers>
                                <DataTrigger TargetType="Image"
                                            Binding="{Binding Source={RelativeSource AncestorType={x:Type xct:Expander}}, Path=IsExpanded}"
                                            Value="True">
                                    <Setter Property="Source"
                                        Value="{Helpers:ImageResource Images.filledRightArrow.png}" />
                                </DataTrigger>
                            </Image.Triggers>
                        </Image>
                        <Label x:Name="heightRef" Text="{Binding SectionLabel}"
                            FontAttributes="Bold"
                            FontSize="Medium" />
                    </StackLayout>
                </xct:Expander.Header>
                            
                <xct:Expander.Content="{Binding SectionView}"/>

            </xct:Expander>
        </DataTemplate>
    </BindableLayout.ItemTemplate>
</StackLayout>

当然,这条线行不通:

<xct:Expander.Content="{Binding View}"/>

我怎样才能实现我的目标?有人能帮我吗 ?我想我不能使用自定义控件,因为我应该根据引用的实际设置类型更改堆栈布局的每个 line/section 的控件类型。

选项 1

此时您不必指定 xct:Expander.Content 无论您放在那里都将隐式设置内容 属性。

替换

<xct:Expander.Content="{Binding SectionView}"/>

<ContentView Content="{Binding SectionView}"/>

选项 2

这样指定:

<DataTemplate>
            <xct:Expander Content="{Binding SectionView}">
                <xct:Expander.Header>
...