UWP MVVM场景下通过ItemTemplate按钮删除ListView项
UWP MVVM列表项删除:如何关联父集合 & PRISM是否值得用?
嘿,我来帮你搞定这个问题——不用第三方重型框架也能解决列表项删除时的关联问题,先给你几个基于UWP原生/官方MVVM工具的方案,再聊聊PRISM的事儿。
核心问题:列表项如何触发父集合的删除操作
方案1:给子ViewModel传递父集合引用(最直接)
这种方式简单粗暴,适合小型项目:
- 你的列表项ViewModel(比如
ProjectItemVM)里存一个父集合的引用(ObservableCollection<ProjectItemVM>) - 创建子项的时候把父集合传进去
- 删除命令直接调用父集合的
Remove(this)就行
代码示例:
// 父ViewModel public class MainVM : ObservableObject // 用Microsoft.Toolkit.Mvvm里的ObservableObject省得自己实现INotifyPropertyChanged { public ObservableCollection<ProjectItemVM> Projects { get; } = new(); public MainVM() { // 添加项目时传递父集合 Projects.Add(new ProjectItemVM(Projects) { ProjectName = "我的第一个项目" }); } } // 列表项ViewModel public class ProjectItemVM : ObservableObject { private readonly ObservableCollection<ProjectItemVM> _parentList; public ICommand DeleteCmd { get; } public string ProjectName { get; set; } public ProjectItemVM(ObservableCollection<ProjectItemVM> parentList) { _parentList = parentList; DeleteCmd = new RelayCommand(DeleteSelf); // RelayCommand也是Toolkit里的 } private void DeleteSelf() { _parentList.Remove(this); } }
如果没引用Microsoft.Toolkit.Mvvm,可以自己写个简单的RelayCommand,或者直接添加这个NuGet包——它是微软官方维护的,属于UWP生态的标配轻量工具,比自己实现稳定多了。
方案2:用事件通知父ViewModel处理(低耦合)
如果你不想让子ViewModel依赖父集合,怕耦合太高,可以用事件:
- 子ViewModel里定义一个
DeleteRequested事件,点击删除按钮时触发 - 父ViewModel在添加子项时订阅这个事件,收到事件后移除对应项
代码示例:
// 子ViewModel public class ProjectItemVM : ObservableObject { public event EventHandler DeleteRequested; public ICommand DeleteCmd { get; } public string ProjectName { get; set; } public ProjectItemVM() { DeleteCmd = new RelayCommand(() => DeleteRequested?.Invoke(this, EventArgs.Empty)); } } // 父ViewModel public class MainVM : ObservableObject { public ObservableCollection<ProjectItemVM> Projects { get; } = new(); public MainVM() { var newItem = new ProjectItemVM { ProjectName = "我的第二个项目" }; newItem.DeleteRequested += HandleItemDelete; Projects.Add(newItem); } private void HandleItemDelete(object sender, EventArgs e) { if (sender is ProjectItemVM itemToDelete) { Projects.Remove(itemToDelete); } } }
关于PRISM的疑问:它是标准方案吗?
PRISM是微软推出的成熟的企业级MVVM框架,属于社区认可度很高的标准方案,但它不是UWP自带的。要不要用它看你的项目规模:
- 如果只是做个简单的列表展示+删除,完全没必要引入PRISM——上面的方案或者官方Toolkit就足够,轻量化还能快速解决问题
- 如果你的项目需要复杂的导航、依赖注入、模块化开发,PRISM能帮你省很多事儿,它的设计就是为了大型应用
总结一下:先试试官方的Microsoft.Toolkit.Mvvm,足够应付你的需求;如果以后项目复杂度上来了,再考虑引入PRISM也不迟。
内容的提问来源于stack exchange,提问作者parphane
相关产品推荐
相关产品推荐

