情况:
- 我已经有一个标签栏作为菜单(在底部).
- 我想在顶部为每个选项卡页面另一个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}" />
...
任何帮助都是感激的。也欢迎关于如何实现它的想法与这里描述的不同的建议。
我已经试着通过谷歌找到有帮助的想法,但不幸的是我的搜索没有成功。
1条答案
按热度按时间0ejtzxu11#
不确定这是否是最好的等待实现这一点,但这里有一个想法
使所有这些对象(人物、动物、植物)成为某个BaseObject的后代
在你的ViewModel中有一个ObservableRangeCollection(你可能需要从某个地方获得它的代码),我假设你已经有了某种selectedValue Observable字符串,它将包含所选标签的值。
创建一个OnSelectedValueChanged方法,该方法将清除ObservableRangeCollection并添加适当的数据(这应该在更改选项卡时触发)
为每个类型创建一个DataTemplate,然后创建一个DataTemplateSelector,它将根据DataType选择模板(obj.GetType())
请注意,我从来没有实现过这一点,但它似乎可行