You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:10:20