WPF应用程序(.NET Core) 列表数据编辑(弹出层形式 反填+修改)
WPF应用程序(.NET Core) 列表数据编辑(弹出层形式反填+修改)
一、列表操作列中加入编辑按钮--并绑定事件
1、 .xaml文件设计
在WPF中如何使用RelativeSource绑定
1 2 3 4 <Button 5 Command="{Binding Path=DataContext.EditOpenCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 6 CommandParameter="{Binding}" 7 Content="编辑" />Button
以下可借助参考别人的,不全一样 :
2、创建用于在点击列表编辑按钮后触发实现显示dialog接口 (接口名字后面改成了IDialogShow)
1 ///IDialogHostService2 /// 弹出层接口, 用于弹出 弹出层 3 /// 4 public interface IDialogHostService 5 { 6 /// 7 /// 弹出弹出层窗口 8 /// 9 /// 弹出层页面的名 10 /// 给弹出层的页面传递的参数 11 /// 弹出层的控件的Identifier属性的值 默认使用Home.xaml视图里的 DialogHost 控件 12 /// 13 Task ShowDialog(string name, IDialogParameters parameters, string dialogHostName = "RootDialog"); 14 }
3、 .cs触发事件编辑(笔记涉及IDialogHostServer接口名字后面改成了IDialogShow)
1 private readonly IDialogHostService _IDialogHostService; 2 ///.cs文件3 /// 列表操作列编辑委托 4 /// 5 /// 编辑按钮 6 public DelegateCommand EditOpenCommand { get; private set; } 7 public UserManagerViewModel(IDialogHostService _IDialogHostServices, IEventAggregator aggregators, IRegionManager regionManager) : base(aggregators) 8 { 9 this.regionManager = regionManager; 10 EditOpenCommand = new DelegateCommand (OpenUpdDialog); 11 //依赖注入dialog服务,用于弹出弹出层 12 _IDialogHostService = _IDialogHostServices; 13 } 14 /// 15 /// 打开编辑页页dialog的方法 16 /// 17 /// 传递的参数 18 public async void OpenUpdDialog(LoginUser u) 19 { 20 //存放dialog初始的数据--反填 21 DialogParameters param = new DialogParameters(); 22 if (u != null) 23 { 24 param.Add("UserValue", u); 25 } 26 //弹出用户修改dialog UserUpd--修改页名(.xaml文件名) 27 var dialogResult = await _IDialogHostService.ShowDialog("UserUpd", param); 28 }
4、创建在弹出diaolg后,弹出层中的点击事件的实现接口
1 ///IDialogOperate2 /// 定义弹出窗口实现方法的接口 3 /// 4 public interface IDialogOperate 5 { 6 7 /// 8 /// 窗体名称 9 /// 10 string WindowName { get; set; } 11 12 /// 13 /// 打开过程中执行 14 /// 15 /// 参数 16 void OnDialogOpend(IDialogParameters parameters); 17 18 /// 19 /// 确定命令 20 /// 21 DelegateCommand SaveCommand { get; set; } 22 23 /// 24 /// 取消命令 25 /// 26 DelegateCommand CancelCommand { get; set; } 27 }
5、创建DialogShow.cs类继承并实现上述IDialogShow接口类
1 public class DialogShow : DialogService, IDialogShow 2 { 3 //prism Ioc 容器 4 private readonly IContainerExtension containerExtension; 5 6 ///DialogShow7 /// 注入ioc容器 8 /// 9 /// 10 public DialogShow(IContainerExtension containerExtension) : base(containerExtension) 11 { 12 this.containerExtension = containerExtension; 13 } 14 /// 15 /// 弹出弹出层窗口 16 /// 17 /// 弹出层页面的类名 18 /// 给弹出层的页面传递的参数 19 /// 弹出层的 Identifier属性的key 20 /// 21 /// 22 23 public async Task ShowDialog(string name, IDialogParameters parameters, string dialogHostName = "RootDialog") 24 { 25 if (parameters == null) 26 parameters = new DialogParameters(); 27 28 //在App.xaml中注入的IOC(prism自带的IOC) 29 //从容器当中取出弹出窗口的实例根据弹出层的类名 根据名称获取视图 30 var content = containerExtension.Resolve<object>(name); 31 //判断是否弹出层这个容器注入到了IOC中 有没有APP。xaml注册 32 if (content == null) 33 { 34 throw new NullReferenceException("IOC容器中没有执行弹出层要弹出的窗体"); 35 } 36 //验证实例的有效性 验证弹出层类型是否是WPF的元素 必须是FrameworkElement类型 37 //是则把他赋值给dialogContent 38 if (!(content is FrameworkElement dialogContent)) 39 throw new NullReferenceException("弹出层的 content 必须是 FrameworkElement 类型"); 40 41 //是则把他转化(赋值)为view 42 if (dialogContent is FrameworkElement view && view.DataContext is null && ViewModelLocator.GetAutoWireViewModel(view) is null) 43 ViewModelLocator.SetAutoWireViewModel(view, true); 44 45 //如果没有继承IDialogShow接口 46 if (!(dialogContent.DataContext is IDialogOperate viewModel)) 47 throw new NullReferenceException("弹出层 ViewModel 必须继承接口 IDialogOpenWindow "); 48 49 //赋值dialog名 50 viewModel.WindowName = dialogHostName; 51 52 //一个委托 53 DialogOpenedEventHandler eventHandler = (sender, eventArgs) => 54 { 55 if (viewModel is IDialogOperate aware) 56 { 57 //调用打开过程中执行方法 58 aware.OnDialogOpend(parameters); 59 } 60 eventArgs.Session.UpdateContent(content); 61 }; 62 return (IDialogResult)await DialogHost.Show(dialogContent, viewModel.WindowName, eventHandler); 63 64 } 65 }
5、App.Xaml文件prism IOC容器注册
6、创建弹出层页面窗体(右键添加用户控件)和其ViewModel类 App.xaml文件中映射建立联系
7、设计xaml页面布局(他作为一个弹出层页面当前)