0

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

public interface ISettings
{
    string SectionLabel { get; }

    View SectionView  { get; }
}

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

我有一个包含所有设置列表的设置页面: public List settingsSections { 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}"/>

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

4

1 回答 1

0

选项1

您不必xct:Expander.Content在此时指定任何您放在那里的内容都会隐式设置 Content 属性。

代替

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

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

选项 2

以这种方式指定它:

<DataTemplate>
            <xct:Expander Content="{Binding SectionView}">
                <xct:Expander.Header>
...
于 2021-02-28T12:17:28.440 回答