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
    }
}