Взаимодействие двух окон между собой

Т.к. на форумах MSDN буквально за последние 24 часа задают практически один и тот же вопрос дважды (тык и тык), то давайте я напишу небольшой пример. Под катом первая форма, создаст вторую форму и будет управлять ей и узнавать о событиях там происходящих. Пример простой, но надеюсь наглядный.

1. В пустой WPF проект добавляем второе окно. Даем ему имя SecondWindow. На этом окне будет компонент для ввода данных и кнопка отправить. Если то что ввели является числом, то по нажатию на кнопку "Отправить" текст будет зеленеть, если нет, то краснеть. Для этого на форму размещаем следующую разметку:

<Window x:Class="WpfApplication6.SecondWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SecondWindow" SizeToContent="WidthAndHeight">
    <StackPanel Orientation="Horizontal">
        <TextBox x:Name="tbInput" Width="150" Margin="5" />
        <Button Content="Отправить" Margin="5" Click="Button_Click" />
    </StackPanel>
</Window>

2. В коде страницы объявляем событие, через которое мы будем отправлять уведомление о нажатии кнопки и подготовленном тексте в главную форму:

public event Action<string> TextEntered;

protected void OnTextEntered(string p_text)
{
    var handler = TextEntered;
    if (handler != null)
    {
        handler(p_text);
    }
}

3. В эту же форму добавляем метод раскраски текста:
 
public void ConfirmNumber(bool p_isConfirm)
{
    if (p_isConfirm)
    {
        tbInput.Foreground = new SolidColorBrush(Colors.Green);
    }
    else
    {
        tbInput.Foreground = new SolidColorBrush(Colors.Red);
    }
}
 
4. Ну и обработчик клика на кнопке:
 
private void Button_Click(object sender, RoutedEventArgs e)
{
    OnTextEntered(tbInput.Text);
}
 
На этом со второй формой все. Как видно, у нее нет никакой логики для принятия решения о покраске текста. Только уведомление об окончании ввода и раскраска в зависимости от переданного параметра. Всю логику мы соберем на главной форме. XAML на ней править не буду, только код.
5. В код главной формы добавляем поле для хранения ссылки на вторую форму:

private SecondWindow _second;

6. Добавляем метод принимающий решение о введенном на второй форме тексте и уведомляющий ее о принятом решении:
 
private void CheckText(string p_text)
{
    int x;
    var result = false;
    if (int.TryParse(p_text, out x))
    {
        result = true;
    }
    _second.ConfirmNumber(result);
}
 
7. Ну и правим конструктор формы и пишем метод обслуживающий событие Loaded, для создания второго окна и подписывания предыдущего метода на событие второй формы.

public MainWindow()
{
    InitializeComponent();
    Loaded += MainWindow_Loaded;
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    _second = new SecondWindow();
    _second.TextEntered += CheckText;
    _second.Show();
}

8. Запускаем, главная форма сразу после запуска показывает вторую и вводя в ней разные значения мы можем нажимая кнопку Отправить получать разный цвет текста:
Все, главная форма может влиять на дочернюю, а дочерняя передавать по своей инициативе данные главной для обработки.