从另一个类调用Window_Loaded事件

本文关键字:Loaded 事件 Window 调用 另一个 | 更新日期: 2023-09-27 18:24:32

My MainWindow.xaml.cs类包括以下Window_Loaded事件:

public void Window_Loaded(object sender, RoutedEventArgs e)
{
    SQLClass sqlclass = new SQLClass();
    sqlclass.initSQL(dataGrid1);
}

因此,我从SQLClass调用这个initSql(Datagrid dataGrid)方法,它实际上将我的dataGrid绑定到Sql表。

public void initSQL(DataGrid dataGrid)
{
    AppDomain.CurrentDomain.SetData("DataDirectory", "C:''Users''Osman''");
    try
    {
        using (SqlConnection cn = new SqlConnection("Data Source=.''SQLExpress;Initial Catalog=FinalApplication1;Integrated Security=True;"))
        {
            cn.Open();
            SqlDataAdapter adap = new SqlDataAdapter("SELECT Time, Condition FROM Status", cn);
            System.Data.DataSet ds = new System.Data.DataSet();
            adap.Fill(ds, "Status");
            dataGrid.DataContext = ds.Tables["Status"].DefaultView;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error'n" + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

这在启动时非常有效,但当我想在向Sql表插入值后更新dataGrid时,我会从BluetoothLE类调用Window_Loaded方法:

public class BluetoothLE
{
    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        dispatcherTimer.Stop();
        MainWindow mainwin = new MainWindow();
        mainwin.Window_Loaded(this, null);
    }
}

问题是,在这种情况下,dataGrid不会更新。Window_Loaded方法被触发,但它不更新dataGrid。这里到底出了什么问题?。

从另一个类调用Window_Loaded事件

您正在创建一个不显示的主窗口的新实例,而不是更新当前MainWindowdatagrid。尝试:

private void Update()
{
    //enter datagrid functionality you have in window load event
}
public class BluetoothLE
{
    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        dispatcherTimer.Stop();
        Update();
    }
}

代码:

MainWindow mainwin = new MainWindow();
mainwin.Window_Loaded(this, null);

将不起作用,您需要在MainWindow的当前实例上调用Window_Loaded,创建新实例(使用new MainWindow()行)不会影响屏幕上显示的窗口。

我不知道你在哪里创建BluetoothLE类,但它需要有一个对MainWindow实例的引用,这样它才能调用上面的方法

public class BluetoothLE
{
    private MainWindow windowInstance;
    public BluetoothLE(MainWindow windowInstance) {
        this.windowInstance = windowInstance;
    }
    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        dispatcherTimer.Stop();
        windowInstance.Window_Loaded(this, null);
    }
}

如果您从MainWindow:内部的创建BluetoothLE

var bluetooth = new BluetoothLE(this);

如果你想摆脱这种依赖(从长远来看,你可能应该这样做),你可能想使用C#事件,但那是另一回事。

另外,将更新代码提取到一个名为UpdateGrid()或其他的单独方法中,并从Window_Load事件和其他需要更新的地方调用它,Window_Load不应该用于从其他地方更新UI。

((MainWindow)Application.Current.MainWindow).Window_Loaded(this, null);

这应该做你想做的事情,尽管这是一种非常丑陋的方式