Xamarin中如何不使用转换器根据ItemsSource数量控制视图显隐
实现方案
你可以直接通过**数据触发器(DataTrigger)**实现需求,不需要额外写值转换器,直接在XAML里给StackLayout加触发器规则即可。
方法1:绑定集合Count属性做判断
修改你的StackLayout代码如下:
<StackLayout Padding="0,0,0,15" x:Name="GoalsStack" BindableLayout.ItemTemplateSelector="{StaticResource Goaltemplateselector}" BindableLayout.ItemsSource="{Binding FinalGoalList}"> <StackLayout.Triggers> <DataTrigger TargetType="StackLayout" Binding="{Binding FinalGoalList.Count}" Value="0"> <Setter Property="IsVisible" Value="False"/> </DataTrigger> </StackLayout.Triggers> </StackLayout>
逻辑说明:
- StackLayout默认
IsVisible属性为True - 当绑定的
FinalGoalList的数量等于0时,触发器会自动把IsVisible设为False实现隐藏 - 集合数量发生变化时触发器会自动生效,不需要额外写业务逻辑
方法2:兼容集合为空的场景
如果存在FinalGoalList可能为Null的情况,可以再加一个触发器覆盖Null场景:
<StackLayout Padding="0,0,0,15" x:Name="GoalsStack" BindableLayout.ItemTemplateSelector="{StaticResource Goaltemplateselector}" BindableLayout.ItemsSource="{Binding FinalGoalList}"> <StackLayout.Triggers> <!-- 集合为Null时隐藏 --> <DataTrigger TargetType="StackLayout" Binding="{Binding FinalGoalList}" Value="{x:Null}"> <Setter Property="IsVisible" Value="False"/> </DataTrigger> <!-- 集合数量为0时隐藏 --> <DataTrigger TargetType="StackLayout" Binding="{Binding FinalGoalList.Count}" Value="0"> <Setter Property="IsVisible" Value="False"/> </DataTrigger> </StackLayout.Triggers> </StackLayout>
注意事项:
- 如果你用
ObservableCollection作为FinalGoalList的类型,集合增减元素时Count属性会自动发送变更通知,触发器会自动刷新显隐状态 - 如果是普通List类型,你需要在给List赋值后手动触发属性变更通知,否则触发器不会识别到Count变化
内容的提问来源于stack exchange,提问作者Sagar Soni
相关产品推荐
相关产品推荐

