Передача имени файла (строковый аргумент) из дочернего окна в нестатический метод родительского окна - PullRequest
2 голосов
/ 28 ноября 2011

Из родительского окна мне нужно открыть файл и заполнить различные таблицы и элементы управления (принадлежащие родительскому окну), используя его содержимое.Имя файла (строка) формируется в дочернем окне с помощью 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!
        }

Iзнаю, что я даже не должен пытаться получить доступ к нестатическим членам из статического метода.Я просто пытаюсь объяснить свою задачу.Есть ли способ в WPF (где класс Window определен в XAML), чтобы получить доступ к экземпляру Parent окна во время выполнения и чем его методы?Я не против изменить тотальный подход, если есть более элегантное и простое решение.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

В самой простой форме вы можете получить ссылку на родительское окно через свойство Owner и изменить существующий метод LoadResults на метод экземпляра.

MainWindow parent = this.Owner as MainWindow;
parent.LoadResults(fileName);
0 голосов
/ 28 ноября 2011

Если вы хотите, чтобы ваш метод был статическим, просто передайте ему все необходимые аргументы. Другой вариант - сделать ваш экземплярный метод LoadResults вместо статического.

...