WPF C#:如何在同一父控件内的UserControl间传递值?
解决mwidget向editemploy传递值的方案
下面提供两种实用的实现方式,适配你现有的控件切换逻辑:
方法一:自定义带参数的事件(推荐,解耦性好)
这种方式通过扩展事件传递参数,让控件间通信更规范,避免直接依赖。
步骤1:定义带参数的事件类
在项目中新建一个类,用于传递需要的数据:
public class EmployEventArgs : EventArgs { // 根据你的需求添加需要传递的属性,比如员工ID、姓名等 public int EmployId { get; set; } public string EmployName { get; set; } // 其他需要的字段... }
步骤2:修改mwidget的事件定义和触发逻辑
更新mwidget的代码,替换原有无参事件为带参数的事件,并在触发时传入数据:
public partial class mwidget : UserControl { // 替换原有ShowUserControl2Requestedd事件,改为带参数的版本 public event EventHandler<EmployEventArgs> ShowEditEmployRequested; public mwidget() { InitializeComponent(); } private void add_employ(object sender, RoutedEventArgs e) { // 原有添加逻辑不变 ShowUserControl2Requested?.Invoke(this, EventArgs.Empty); } private void edit_employ(object sender, RoutedEventArgs e) { // 1. 获取要传递的员工数据(这里假设你有选中的员工对象,替换成你实际的获取逻辑) var selectedEmploy = GetSelectedEmploy(); // 2. 触发带参数的事件 ShowEditEmployRequested?.Invoke(this, new EmployEventArgs { EmployId = selectedEmploy.Id, EmployName = selectedEmploy.Name }); } // 示例方法:模拟获取选中员工的逻辑,替换成你实际的代码 private Employ GetSelectedEmploy() { return new Employ { Id = 1, Name = "张三" }; } } // 示例员工实体,根据你的实际情况调整 public class Employ { public int Id { get; set; } public string Name { get; set; } }
步骤3:修改父页面的事件订阅和传值逻辑
更新主页面的后台代码,订阅新的带参数事件,并在触发时将数据传递给editemploy:
private void UserControl1_Loaded(object sender, RoutedEventArgs e) { mwidget.ShowUserControl2Requested += OnShowUserControl2Requested; addemploy.ShowUserControl1Requested += OnShowUserControl1Requested; editemploy.ShowUserControl1Requestedd += ShowUserControl1Requestedd; // 替换原有无参事件的订阅,改为新的带参数事件 mwidget.ShowEditEmployRequested += OnShowEditEmployRequested; } // 新增处理带参数事件的方法 private void OnShowEditEmployRequested(object sender, EmployEventArgs e) { // 1. 切换控件显示 editemploy.Visibility = Visibility.Visible; mwidget.Visibility = Visibility.Collapsed; // 2. 将传递的数据赋值给editemploy的属性或调用其方法 editemploy.SetEmployData(e.EmployId, e.EmployName); } // 原有其他方法保持不变 private void OnShowUserControl2Requested(object sender, EventArgs e) { addemploy.Visibility = Visibility.Visible; mwidget.Visibility = Visibility.Collapsed; } private void OnShowUserControl1Requested(object sender, EventArgs e) { mwidget.Visibility = Visibility.Visible; addemploy.Visibility = Visibility.Collapsed; } private void ShowUserControl1Requestedd(object sender, EventArgs e) { mwidget.Visibility = Visibility.Visible; editemploy.Visibility = Visibility.Collapsed; }
步骤4:在editemploy中添加接收数据的逻辑
在editemploy的代码中添加接收数据的方法或属性:
public partial class editemploy : UserControl { public editemploy() { InitializeComponent(); } // 用于接收传递过来的员工数据 public void SetEmployData(int employId, string employName) { // 这里将数据绑定到控件的UI元素,比如文本框、标签等 txtEmployId.Text = employId.ToString(); txtEmployName.Text = employName; // 其他逻辑... } }
方法二:通过父控件直接中转(简单直接,适合小型项目)
如果你的项目逻辑简单,可以直接通过父控件的实例引用,在切换控件时直接传递数据:
步骤1:在mwidget中添加获取数据的公共方法
public partial class mwidget : UserControl { // 原有事件和方法不变 // 新增公共方法,供父控件获取选中的员工数据 public Employ GetSelectedEmploy() { // 替换成你实际获取选中员工的逻辑 return new Employ { Id = 1, Name = "张三" }; } }
步骤2:修改父页面的控件切换方法
private void ShowUserControl1Requesteddd(object sender, EventArgs e) { // 1. 获取mwidget中的选中数据 var selectedEmploy = mwidget.GetSelectedEmploy(); // 2. 将数据传递给editemploy editemploy.SetEmployData(selectedEmploy.Id, selectedEmploy.Name); // 3. 切换控件显示 editemploy.Visibility = Visibility.Visible; mwidget.Visibility = Visibility.Collapsed; }
步骤3:editemploy的接收逻辑和方法一相同
同样在editemploy中添加SetEmployData方法来处理数据。
内容的提问来源于stack exchange,提问作者Emad Mohamed
相关产品推荐
相关产品推荐

