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

如何在C# WPF应用的不同.cs类中调用已有方法

在WPF中从其他类调用MainWindow的LoadData方法

下面提供几种可行的实现方式,根据你的项目场景选择:

方法1:获取当前活跃的MainWindow实例

因为LoadData是MainWindow的实例方法,且依赖当前显示窗口的Datagrid控件,你需要获取应用中已打开的MainWindow实例,而非新建一个:

// 在目标类中添加以下代码
using System.Linq;
using System.Windows;

namespace Demo__Project
{
    public class AnotherClass
    {
        public void TriggerLoadData()
        {
            // 从应用已打开窗口中找到MainWindow实例
            var mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
            // 调用LoadData,避免空引用
            mainWindow?.LoadData();
        }
    }
}

注意:这种方式仅适用于MainWindow已经处于打开状态的场景。

方法2:分离数据逻辑与UI操作(推荐)

当前LoadData方法混合了数据查询和UI更新逻辑,耦合度较高。建议将数据获取逻辑抽离到独立的服务类中,降低耦合:

步骤1:创建数据服务类

namespace Demo__Project
{
    public static class DataService
    {
        // 提取连接字符串为常量
        private const string ConnectionString = @"Data Source=DESKTOP-EKH75FM;Initial Catalog=DCS;Integrated Security=True";

        // 封装数据查询逻辑
        public static DataTable GetUserData()
        {
            string query = "SELECT * FROM DemoDatabase.dbo.UserData";
            DataTable dt = new DataTable();
            
            // 使用using自动释放数据库连接,避免泄漏
            using (SqlConnection sqlcon = new SqlConnection(ConnectionString))
            {
                SqlCommand sqlcom = new SqlCommand(query, sqlcon);
                sqlcon.Open();
                SqlDataReader sdr = sqlcom.ExecuteReader();
                dt.Load(sdr);
            }
            
            return dt;
        }
    }
}

步骤2:修改MainWindow的LoadData方法

public void LoadData()
{
    // 调用服务类获取数据
    DataTable dt = DataService.GetUserData();
    // 更新UI
    Datagrid.ItemsSource = dt.DefaultView;
}

步骤3:在其他类中触发更新

你仍然可以通过方法1的方式获取MainWindow实例调用LoadData,也可以基于这个服务类扩展其他逻辑,后续维护会更方便。

方法3:通过构造函数传递MainWindow实例

如果你的目标类是在MainWindow中初始化的,可以直接将MainWindow实例通过构造函数传入:

// 目标类代码
namespace Demo__Project
{
    public class AnotherClass
    {
        private readonly MainWindow _mainWindow;

        // 通过构造函数接收MainWindow实例
        public AnotherClass(MainWindow mainWindow)
        {
            _mainWindow = mainWindow;
        }

        public void RefreshData()
        {
            _mainWindow.LoadData();
        }
    }
}

在MainWindow中初始化该类时传入自身:

public MainWindow()
{
    InitializeComponent();
    LoadData();
    // 初始化AnotherClass并传入当前MainWindow实例
    AnotherClass anotherClass = new AnotherClass(this);
}

额外提醒

你的原始代码中SqlConnection是类字段,多次调用LoadData可能导致连接泄漏。建议使用using语句包裹数据库连接(如方法2中所示),确保连接被正确释放。

内容的提问来源于stack exchange,提问作者Hasan Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:27:19