XAML 在 ListBox 中使用 MVVM 模式时混入自定义布局
2015-11-10 04:33
477 查看
问题
在 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)相关文章推荐
- C#及WPF获取本机所有字体和颜色的方法
- WPF MVVM示例讲解
- PowerShell中调用WPF生成炫酷窗口实例
- WPF实现类似360安全卫士界面的程序源码分享
- C#中WPF使用多线程调用窗体组件的方法
- WPF实现渐变淡入淡出的登陆窗口效果
- WPF的数据绑定详细介绍
- C#读取文本文件到listbox组件的方法
- .net中实现listBox左右移动
- C#实现让ListBox适应最大Item宽度的方法
- WPF绑定实例详解
- ASP.NET小结之MVC, MVP, MVVM比较以及区别(一)
- 关于WPF使用MultiConverter控制Button状态的详细介绍
- asp.net listbox实现单选全选取消
- JS ListBox的简单功能实现代码
- ListBox实现上移,下移,左移,右移的简单实例
- a.sp.net清除ListBox的列表项(删除所有项目)
- 如何搭建新的WPF项目框架
- C#(WinForm) ComboBox和ListBox添加项及设置默认选择项
- 用vs2012创建第一个wpf应用