Закрыть / Скрыть окно из UserControl - PullRequest
0 голосов
/ 31 марта 2020

Я разрабатываю приложение wpf, в котором я взаимодействую с огромной сеткой кнопок (созданной с помощью ItemsControl).

Когда я нажимаю одну кнопку, приложение отображает новое окно. Это новое окно отображает UserControl. Я использую сервис для отображения нового окна:

public class WindowService
{
    #region Variable
    #endregion Variable

    #region Constructor
    public WindowService()
    {

    }
    #endregion Constructor

    #region Properties
    #endregion Properties

    #region Public Method

    public void ShowWindow(object viewModel)
    {
        var win = new WindowView();
        //win.Content = viewModel; <-- not the best way, go to see in comment why (thanks @Ndubuisi Jr)
        win.DataContext = viewModel;
        win.Show();
    }

    #endregion Public Method

    #region Private Method
    #endregion Private Method

}

И код для вызова этого метода:

public void display_InfoPoste(object commandParameter)
    {
        windowPoste = new WindowService();
        windowPoste.ShowWindowCommandParameter(new InfoPosteViewModel(commandParameter));
    }

Нет проблем с этим. (Отображаемое окно является только содержимым для получения другого UserControl)

Теперь у меня есть кнопка «Закрыть» на пользовательском элементе управления, но я не вижу способа закрыть окно. Я работаю с паттерном MVVM, поэтому пока не знаю, как это сделать.

Не могли бы вы мне помочь? (Я могу поделиться с вами скриншотом, если вам нужно)

Большое спасибо

Изображение: часть древовидности проекта


Просто ниже запрошенный код "InfoPosteViewModel.cs"

#region Variable
    private string _commandParameter;   
    #endregion Variable

    #region Constructor

    public InfoPosteViewModel()
    {
        //FermerCommand = new RelayCommand(Action_FermerWindow);
    }

    public InfoPosteViewModel(object commandParameter)
    {
        SelectedViewModel = new InfoPosteViewModel();
        _commandParameter = (string)commandParameter;
        ID = _commandParameter;
    }

    #endregion Constructor

    #region Properties

    public ICommand FermerCommand { get; set; }

    private static string _id;
    public string ID
    {
        get { return _id; }
        set
        {
            _id = value;
            OnPropertyChanged("ID");
        }
    }

    private object _selectedViewModel;
    public object SelectedViewModel
    {
        get
        {
            return _selectedViewModel;
        }
        set
        {
            _selectedViewModel = value;
            OnPropertyChanged("SelectedViewModel");
        }
    }

    #endregion Properties

    #region Public Method

    public void Action_FermerWindow(object commandParameter)
    {

    }

    #endregion Public Method

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Самый чистый способ закрыть окно из его ViewModel в MVVM - использовать вложенное свойство.

public static class perWindowHelper
{
    public static readonly DependencyProperty CloseWindowProperty = DependencyProperty.RegisterAttached(
        "CloseWindow",
        typeof(bool?),
        typeof(perWindowHelper),
        new PropertyMetadata(null, OnCloseWindowChanged));

    private static void OnCloseWindowChanged(DependencyObject target, DependencyPropertyChangedEventArgs args)
    {
        if (!(target is Window view))
            return;

        if (view.IsModal())
            view.DialogResult = args.NewValue as bool?;
        else
            view.Close();
    }

    public static void SetCloseWindow(Window target, bool? value)
    {
        target.SetValue(CloseWindowProperty, value);
    }

    public static bool IsModal(this Window window)
    {
        var fieldInfo = typeof(Window).GetField("_showingAsDialog", BindingFlags.Instance | BindingFlags.NonPublic);
        return fieldInfo != null && (bool)fieldInfo.GetValue(window);
    }
} 

Это можно использовать в xaml-файле вида

<Window
    ....    
    vhelp:perWindowHelper.CloseWindow="{Binding ViewClosed}" />

, привязанного к свойство ViewClosed (типа bool?) из ViewModel. Установка этого значения свойства закроет View.

Подробнее о моем сообщении в блоге

0 голосов
/ 31 марта 2020

Попробуйте передать команду закрытия виртуальной машине, которая отображается в диалоге. Затем свяжите это с кнопкой закрытия или действием. Поскольку это команда закрытия виртуальной машины, которая открыла диалоговое окно, вы можете затем закрыть диалоговое окно, используя ссылку на эту виртуальную машину, и продолжить работу с любым необходимым кодом очистки или отслеживания.

О, и вам понадобится сделать окно переменной экземпляра, а не локальной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...