Закрытие окна из ViewModel его содержимого в MVVM WPF?



Создание такого окна, используя мой пользовательский UserControl в качестве содержимого:



Window newCacheForm = new Window
{
Title = "Add New Cache Tag",
Content = new NewCacheControl()
};


Я хочу открыть Window как диалог и получить результат:



var result = newCacheForm.ShowDialog();


У меня есть код для привязки и установки диалогового окна в true или false, но как закрыть окно из UserControl ViewModel? Если это невозможно сделать, как я могу работать с этим дружественным способом MVVM?

713   1  

1 ответ:

В этом случае я бы использовал присоединенное поведение, оно позволяет использовать независимую логику на стороне View. Я лично его не создавал, но взял here и немного дополнено-добавлено Get() к свойству зависимостей.

Ниже в качестве полного кода этого поведения:

public static class WindowCloseBehaviour
{
    public static bool GetClose(DependencyObject target)
    {
        return (bool)target.GetValue(CloseProperty);
    }

    public static void SetClose(DependencyObject target, bool value)
    {
        target.SetValue(CloseProperty, value);
    }

    public static readonly DependencyProperty CloseProperty = DependencyProperty.RegisterAttached("Close",
                                                                                                  typeof(bool),
                                                                                                  typeof(WindowCloseBehaviour),
                                                                                                  new UIPropertyMetadata(false, OnClose));

    private static void OnClose(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue is bool && ((bool)e.NewValue))
        {
            Window window = GetWindow(sender);

            if (window != null)
                window.Close();
        }
    }

    private static Window GetWindow(DependencyObject sender)
    {
        Window window = null;

        if (sender is Window)
            window = (Window)sender;

        if (window == null)
            window = Window.GetWindow(sender);

        return window;
    }
}

В обработчике щелчка creating new Window я добавил такое поведение:

private void Create_Click(object sender, RoutedEventArgs e)
{
    Window newCacheForm = new Window
    {
        Title = "Add New Cache Tag",
        Content = new TestUserControl(),
        DataContext = new TestModel() // set the DataContext
    };

    var myBinding = new Binding();                // create a Binding
    myBinding.Path = new PropertyPath("IsClose"); // with property IsClose from DataContext
    newCacheForm.SetBinding(WindowCloseBehaviour.CloseProperty, myBinding); // for attached behavior 

    var result = newCacheForm.ShowDialog();

    if (result == false) 
    {
        MessageBox.Show("Close Window!");
    }
}

И в обработчике Close UserControl напишите следующее:

private void Close_Click(object sender, RoutedEventArgs e)
{
    TestModel testModel = this.DataContext as TestModel;
    testModel.IsClose = true;
}

Естественно, вместо Click обработчиков для кнопок должны использоваться команды.

Доступен весь проектhere.

Comments

    Ничего не найдено.