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 /// 
 2     /// 弹出层接口, 用于弹出 弹出层
 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     }
IDialogHostService

  3、   .cs触发事件编辑笔记涉及IDialogHostServer接口名字后面改成了IDialogShow

 1         private readonly IDialogHostService _IDialogHostService;
 2         /// 
 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         }
.cs文件

4、创建在弹出diaolg后,弹出层中的点击事件的实现接口

 1 /// 
 2     /// 定义弹出窗口实现方法的接口
 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     }
IDialogOperate

5、创建DialogShow.cs类继承并实现上述IDialogShow接口类    

 1 public class DialogShow : DialogService, IDialogShow
 2     {
 3         //prism Ioc 容器
 4         private readonly IContainerExtension containerExtension;
 5 
 6         /// 
 7         /// 注入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     }
DialogShow

5、App.Xaml文件prism IOC容器注册

6、创建弹出层页面窗体(右键添加用户控件)和其ViewModel类   App.xaml文件中映射建立联系

7、设计xaml页面布局(他作为一个弹出层页面当前)

WPF