Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Доступ к элементам MainWindow из статического класса

#c_sharp #wpf


Подскажите, пожалуйста, как обратиться к TextBox'у с именем textBox1, размещенному
в MainWindow, из метода статического класса SomeStaticClass?

namespace Programm1
{
   public partial class MainWindow : Window
   {
      public MainWindow()
      {
         InitializeComponent();
      }
   }

   public static class SomeStaticClass
   {
      public static void Test()
      {
         MainWindow.textBox1.Text = "Done!"; // Ошибка 
      }
   }
}


Ошибка:


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

    


Ответы

Ответ 1



Сделать статическую переменную Instance в которой будет форма и обращаться к ней. public partial class MainWindow : Window { public static MainWindow Instance { get; private set; } // тут будет форма public MainWindow() { InitializeComponent(); Instance = this; // инициализируем статическую переменную } } public static class SomeStaticClass { public static void Test() { if (MainWindow.Instance != null) // обращаемся к ней из статического класса/метода MainWindow.Instance.textBox1.Text = "Done!"; } } Возможно, подход не самый правильный, но достаточно простой и понятный. Предложу еще более простой вариант. Переписать статический метод, чтобы он принимал компонент TextBox и менял его свойство, вот так: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); SomeStaticClass.Test(this.TextBox); // передаем наш TextBox в метод } } public static class SomeStaticClass { public static void Test(TextBox textBox) // принимаем наш компонент { if (textBox != null) textBox.Text = "Done!"; // меняем его значение } } В этом подходе никаких статических переменных, просто добавлен параметр в метод.

Ответ 2



Тут вопрос больше не к wpf, а к архитектуре Вашего кода. Для доступа к нестатическим св-вам класса MainWindow Вам так или иначе потребуется экземпляр класса MainWindow. public static class someStaticClass { public static void test(MainWindow wnd) { if (wnd != null && wnd.textBox1 != null) wnd.textBox1.Text = "Done!"; } } Далее Вам нужно будет получить доступ к экземпляру MainWindow. Это можно сделать например создав его самостоятельно (но это врятли Вам подходит): var wnd = new MainWindow(); ... someStaticClass.test(wnd); Либо (что более распространено) например из code-behind по событию: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.SomeEventHandler += MainWindow_SomeEventHandler; } private void MainWindow_SomeEventHandler(object sender, System.EventArgs e) { someStaticClass.test(this); } } Я бы посоветовал Вам не использовать такой подход, а изучить mvvm. Тогда менять св-во текст Вы будете из вьюмодели через механизм привязки. (Без использования класса MainWindow вобще)

Комментариев нет:

Отправить комментарий