#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 вобще)
Комментариев нет:
Отправить комментарий