You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:06:04