XAML 在 ListBox 中使用 MVVM 模式时混入自定义布局

本文介绍了在XAML中使用MVVM模式时,在ListBox中遇到的混入自定义布局的问题。通过设置ItemContainerStyle和利用Trigger判断,实现了在Feedback和About菜单之间插入分割条的效果。解决方案中详细解释了如何利用Style、Trigger和Setter来替换视图模板,以达到预期的布局效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

在 XAML 中使用了 MVVM 的模式实现布局切换,所以在 ListBox 中设置了每个 item 的模板,源码大概是这样子:

<ListBox>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="app:ItemDemo">
            <!--Your item layout here blabla-->
        </DataTemplate>
    <ListBox.ItemTemplate>
    <!-- item list -->
</ListBox>

愉快地实现后,想在 Feedback 和 About 菜单之间加个分割条:

这里写图片描述

因为设置了 item 模板,所以直接加入到列表是没有效果的。

解决方案

这里使用 ItemContainerStyle 来实现。当窗口绘制时都会调用 ItemContainerStyle 来渲染每个 item,所以可以结合 Trigger 判断某个值以便替换不同的视图模板(如果不是很清楚建议先搜索 Style、Trigger、Setter):

<ListBox.ItemContainerStyle>
    <!-- BaseOn 用于设置渲染样式继承 -->
    <Style BasedOn="{ StaticResource MaterialDesignListBoxItem }">
        <Style.Triggers>
            <!-- 注意这里绑定的应该是你 item 数据对象的某个属性 -->
            <!-- 通过这个值来判断是否替换默认视图模板 -->
            <!-- {x:Null} 是系统命名空间中提供的 NULL-->
            <DataTrigger Binding="{Binding Content}" Value="{x:Null}">
                <!-- 指定 ListBoxItem.Control.Template 的值,在 ControlTemplate 类型下包裹你的视图 -->
                <Setter Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <!-- I am here. -->
                            <Separator Margin="8" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <!-- 因为是分割线,所以禁用其点击响应 -->
                <Setter Property="IsEnabled" Value="False" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListBox.ItemContainerStyle>

之后在列表项目中将某个 item 的字段调为 NULL 即可:

...
<app:DemoItem Content="{x:Null}" />
...

最终画完一条万恶的分割线:

这里写图片描述

吐槽

笔者是 Google 几小时总结来的(怪我 Orz)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值