C# - возвращает переменную из дочернего окна в родительское окно в WPF
У меня есть главное окно form1. в form1 у меня есть кнопка, когда она нажата, она откроет form2 (form2.ShowDialog ()). В form2 у меня есть кнопка под названием "проверить". Когда пользователь нажимает "проверить", он должен выполнить некоторую проверку, и в случае успеха создает объект string и возвращает его в form1. Есть идеи, как это реализовать? Я не хочу ничего возвращать, когда пользователь закрывает окно.
3 ответов
создайте событие во втором окне, чтобы параметры делегата события содержали любую информацию, которую вы хотите передать:
public class Popup : Window
{
public event Action<string> Check;
public void Foo()
{
//fire the event
if (Check != null)
Check("hello world");
}
}
затем Главное окно может подписаться на это событие, чтобы сделать то, что он хочет с информацией:
public class Main : Window
{
private Label label;
public void Foo()
{
Popup popup = new Popup();
popup.Check += value => label.Content = value;
popup.ShowDialog();
}
}
этот ответ, хотя и не идеально подходит для цели, будет более полезен людям, которые сами google здесь для общего решения о том, как общаться между окнами:
нет никаких причин настраивать события для доступа к объектам главного окна вашего приложения. Вы можете просто вызвать их на всплывающем коде и сделать с ним:
((MainWindow)Application.Current.MainWindow).textBox1.Text = "Some text";
Это может быть достигнуто несколькими способами. Метод Servy posted довольно хорош и выполнит то, что вам нужно. Я бы предпочел увидеть Action<sting>
передается в качестве параметра конструктору и называется callback
так что понятно, для чего он используется, но это просто предпочтение.
другой метод, который довольно хорош для этого, - это обмен сообщениями. The MVVMLight Инструментарий обеспечивает большую маленькую особенность в нем, для выполнения таких задач, как этот.
Шаг 1: Создайте строго типизированное сообщение:
public class MyMessage : MessageBase
{
//Message payload implementation goes here by declaring properties, etc...
}
Шаг 2: Определите, где и когда опубликовать это сообщение.
public class PublishMessage
{
public PublishMessage(){
}
public void MyMethod()
{
//do something in this method, then send message:
Messenger.Default.Send(new MyMessage() { /*initialize payload here */ });
}
}
Setp 3: Теперь, когда вы отправляете сообщение, вы должны иметь возможность получить это сообщение:
public class MessageReceiver
{
public MessageReceiver()
{
Messenger.Default.Register<MyMessage>(this, message => Foo(message));
}
public void Foo(MyMessage message)
{
//do stuff
}
}