XAML .NET Maui视图更改与无线电控制

au9on6nz  于 2023-01-22  发布在  .NET
关注(0)|答案(1)|浏览(151)

情况:

  • 我已经有一个标签栏作为菜单(在底部).
  • 我想在顶部为每个选项卡页面另一个TabView。

问题:

  • 我不能使用DevExpress的TabView,因为这只适用于iOS和Android(但我想在Android和Windows上使用该应用程序)。
  • 我无法使用Syncfusion的SfTabView,因为目前我没有获得批准的社区许可证。

我发现了一个很好的例子,我可以使用单选按钮来完成这一点。但是我不知道我如何完成以下任务:
我想根据选中的单选按钮值更改内容页的数据模板和数据源。
我的想法是这样的:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:Demo"
             xmlns:controls="clr-namespace:Demo.Controls"
             ...>

    <ContentPage.BindingContext>
        <local:PeopleViewModel x:Key="PeopleView" />
        <local:AnimalViewModel x:Key="AnimalView" />
        <local:PlantViewModel x:Key="PlantView" />
    </ContentPage.BindingContext>

    <ContentPage.Resources>
        <DataTemplate x:Key="PeopleTemplate">
            <controls:CardView BorderColor="DarkGray"
                               CardTitle="{Binding Name}"
                               CardDescription="{Binding Description}"
                               ControlTemplate="{StaticResource PeopleCardView}" />
        </DataTemplate>
        <DataTemplate x:Key="AnimalTemplate">
            <controls:CardView BorderColor="DarkGray"
                               CardTitle="{Binding Name}"
                               CardDescription="{Binding Description}"
                               ControlTemplate="{StaticResource AnimalCardView}" />
        </DataTemplate>
        <DataTemplate x:Key="PlantTemplate">
            <controls:CardView BorderColor="DarkGray"
                               CardTitle="{Binding Name}"
                               CardDescription="{Binding Description}"
                               ControlTemplate="{StaticResource PlantCardView}" />
        </DataTemplate>
    </ContentPage.Resources>

    ...

    <StackLayout Margin="10"
                 BindableLayout.ItemsSource="{Binding People}"
                 BindableLayout.ItemTemplate="{StaticResource PeopleTemplate}" />


</ContentPage>

现在,我想用代码替换StackLayout部分,以便根据单选按钮值设置的内容(People、Animal、Plant),将StackLayout的ItemSource和ItemTemplate与相应的数据一起使用。
对于People

...
    <StackLayout Margin="10"
                 BindableLayout.ItemsSource="{Binding People}"
                 BindableLayout.ItemTemplate="{StaticResource PeopleTemplate}" />
...

对于Animal

...
    <StackLayout Margin="10"
                 BindableLayout.ItemsSource="{Binding Animal}"
                 BindableLayout.ItemTemplate="{StaticResource AnimalTemplate}" />
...

对于Plant

...
    <StackLayout Margin="10"
                 BindableLayout.ItemsSource="{Binding Plant}"
                 BindableLayout.ItemTemplate="{StaticResource PlantTemplate}" />
...

任何帮助都是感激的。也欢迎关于如何实现它的想法与这里描述的不同的建议。
我已经试着通过谷歌找到有帮助的想法,但不幸的是我的搜索没有成功。

0ejtzxu1

0ejtzxu11#

不确定这是否是最好的等待实现这一点,但这里有一个想法
使所有这些对象(人物、动物、植物)成为某个BaseObject的后代
在你的ViewModel中有一个ObservableRangeCollection(你可能需要从某个地方获得它的代码),我假设你已经有了某种selectedValue Observable字符串,它将包含所选标签的值。
创建一个OnSelectedValueChanged方法,该方法将清除ObservableRangeCollection并添加适当的数据(这应该在更改选项卡时触发)
为每个类型创建一个DataTemplate,然后创建一个DataTemplateSelector,它将根据DataType选择模板(obj.GetType())
请注意,我从来没有实现过这一点,但它似乎可行

相关问题