datagrid wpf 刷新数据_WPF开发中ViewModel相互传参和弹框回传参的解决办法

本文详细介绍了在WPF开发中,如何使用ViewModel进行参数传递,包括在打开模态窗口时的数据传递以及弹框后的回传参数。通过Prism的事件聚合机制,实现了跨页面通信,确保在验证通过后更新界面按钮状态。同时,文章提供了一个基于MVVM和Prism的WPF管理框架的实践示例。
摘要由CSDN通过智能技术生成

7cc4feecf67e1077b943c3ea7d3e52cd.png
JHRS开发框架之ViewModel相互传参和弹框回传参的解决办法,这个系列的文章旨在记录工作中使用WPF开发新的医疗项目中,有感于必须统一掉一些规范上的事情,并且提高团队开发效率,遂折腾了这么一个半吊子的框架,这个标题WPF企业级开发框架搭建指南,2020从入门到放弃可能会唬住一些人,但看到这些零碎文字的朋友就凑和着看吧,如果能帮助到你,那也荣幸了。

继上一篇烂尾文章分享了一些WPF数据验证的话题,这一篇来说一下ViewModel相互传参的问题,这也是在搭建JHRS开发框架中遇到的一些问题,并把它封装了一下。

这个演示的WPF开发管理系统的框架是基于MVVM来搭建的,因此业务处理都是在ViewModel里面完成的,而在实际项目中,难免会有两个页面(Page)跳来跳去的,它们在跳来跳去的时候是需要传递参数的,因为在这个框架中引入了Prism,事情就变更加的简单了。为了方便描述呢,本文就将模态窗口称为弹框页面了。

ViewModel相互传参

常见的业务场景就是在管理页列页面中,点击表格里面(DataGrid)某一行数据的编辑按钮,进行编辑,这时就会跳转到另外一个页面或者使用模态窗口打开一个弹框页面,在这个页面上进行编辑操作,在跳转的时候就会将参数进行传递,不然怎么在新开的页面知道你要干嘛呢?

在ViewModel相互传参的时候,可以使用对象的方式,也可以使用基本类型进行传递;因为在BaseViewModel这个基类中提供了打开弹框(模态窗口)窗体的功能,并且提供了一个object对象,参数为args的可选参数,可用于传参,代码如下:

  /// <summary>
  /// 打开模态窗口
  /// </summary>
  /// <param name="page">内容页面</param>
  /// <param name="icon">图标</param>
  /// <param name="pageTitle">页面标题</param>
  /// <param name="args">页面传参</param>
  /// <param name="callback">关闭窗体后执行的回调函数</param>
  /// <param name="disableArea">是否禁用弹框页面的保存,取消区域(即隐藏保存,取消按钮)</param>
    protected void ShowDialog(string page, IconEnum icon, string pageTitle = "未设置标题", object args = null, Action<IDialogResult> callback = null, bool disableArea = false)
 {
      IDialogWindow
WPF(Windows Presentation Foundation)的应用程序,通常采用MVVM(Model-View-ViewModel)设计模式,ViewModel层负责处理数据逻辑,视图(View)用于用户交互。如果你想要在ViewModel调用DataGrid刷新方法,你可以按照以下步骤操作: 1. **在ViewModel**:首先,你需要在你的ViewModel类里声明一个委托或者事件,表示DataGrid需要刷新的行为,例如: ```csharp public event Action DataGridRefreshRequired; ``` 2. **公开刷新方法**:在ViewModel内定义一个方法,当需要刷新DataGrid时,触发这个事件: ```csharp private void RefreshDataGrid() { DataGridRefreshRequired?.Invoke(); } ``` 3. **在DataGrid上绑定**:在XAML文件,将`DataGridRefreshRequired`事件绑定到DataGrid的某个可以触发刷新的按钮、命令或者直接绑定到`OnDemandLoading`属性(如果DataGrid支持的话),以便于从视图层面响应。 ```xaml <DataGrid Command="{Binding RefreshDataCommand}" On DemandLoading="DataGrid_OnDemandLoading" /> ``` 4. **实现DataGrid绑定事件**:如果DataGrid本身有内置的刷新机制,如`OnDemandLoading`事件,你需要在你的视图模型添加相应的处理函数: ```csharp private void DataGrid_OnDemandLoading(object sender, EventArgs e) { ViewModel.RefreshDataGrid(); // 触发ViewModel刷新方法 } ``` 或者对于按钮或其他UI元素: ```xaml <Button Content="刷新" Command="{Binding RefreshDataCommand}" /> ``` 5. **设置Command**:确保`RefreshDataCommand`在ViewModel已经正确地设置,它会调用`RefreshDataGrid`方法: ```csharp private ICommand _refreshDataCommand; public ICommand RefreshDataCommand => _refreshDataCommand ?? (_refreshDataCommand = new RelayCommand(RefreshDataGrid)); ``` 这里假设使用了`RelayCommand`作为命令管理器,它是一个常用的简单命令实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值