将文件名(字符串参数)从子窗口传递到父窗口的非静态方法

时间:2011-11-28 17:24:21

标签: c# wpf parent

从父窗口我需要打开一个文件并使用其内容填充不同的表和控件(属于父窗口)。文件名(字符串)由子窗口中的DataGrid.SelectedItem

形成
private void LoadResultsCommand_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            var row = pastTestResultsDataGrid.SelectedItem as DataRowView;

            if (row != null)
            {
                string fileName = row[0] + " " + row[1] + " " + row[2] + " " + row[3] + " " + row[4] + " " + 
                    ((DateTime)row[6]).ToShortDateString().Replace('/', '-') + " " + ((DateTime)row[7]).ToShortDateString().Replace('/', '-') + " .dat";
                MainWindow.LoadResults(fileName);
            }

        }

正如您在Parent(MainWindow)中看到的,我必须使用静态方法

public static void LoadResults(string fileName)
        {
            string fullFileName = @"C:\Users\Public\Documents\Test Data\" + fileName;
            var binFormat = new BinaryFormatter();
            var testData = new TestData();

            if (File.Exists(fullFileName))
            {
                using (Stream fStream = new FileStream(fullFileName, FileMode.Open))
                {
                    testData = (TestData) binFormat.Deserialize(fStream);
                }
            }    
            //here I am trying to load data from testData instance of TestData class into data 
            //tables or set Text property of a TextBox. Can't access them from a static method!
        }

我知道我甚至不应该尝试从静态方法访问非静态成员。我只想解释我的任务。 WPF中是否有任何方法(在XAML中定义类Window)在运行时访问Parent窗口的实例而不是其方法?如果有更优雅,更简单的解决方案,我不介意改变整体方法。

2 个答案:

答案 0 :(得分:2)

以最简单的形式,您可以通过Owner属性获取对父窗口的引用,并将现有的LoadResults方法更改为实例方法。

MainWindow parent = this.Owner as MainWindow;
parent.LoadResults(fileName);

答案 1 :(得分:0)

如果你想让你的方法静态,只需传递你需要的所有参数。另一个选项是使您的LoadResults实例方法实例化为静态。