Я запустил окно, содержащее UserControl из моей MainWindowViewModel, и я хочу закрыть это окно - PullRequest
0 голосов
/ 07 февраля 2019

Я запускаю Окно, которое содержит UserControl, и я хочу закрыть это Окно из ViewModel UserControl.Каков наилучший и самый чистый способ достичь этого, придерживаясь MVVM?

В идеале, я хотел бы вызывать ту же команду, которая вызывается кнопкой IsCancel, когда она закрывает окно.У меня нет кода, привязанного к моей кнопке отмены, и она отлично закрывает окно.

Вот что я сейчас делаю ...

Я запускаю окно с UserControl из MainWindowViewModel и передаюMainWindowViewModel для ViewModel UserControl следующим образом:

        Window window = new Window
        {
            Title = "Sign In",
            Height = 350,
            Width = 500,
            WindowStartupLocation = WindowStartupLocation.CenterScreen,
            WindowStyle = WindowStyle.ToolWindow,
            ResizeMode = ResizeMode.NoResize,
            Content = new SignIn(mainWindowViewModel: this)
        };

        window.ShowDialog();

Я просто не очень уверен, как закрыть окно из ViewModel UserControl.

1 Ответ

0 голосов
/ 07 февраля 2019

Заполняя здесь довольно много пробелов, но, предполагая, что SignIn - это ваша модель представления, вы можете передать действие / обратный вызов, который ваша модель SignIn может вызвать для закрытия окна:

Window window = new Window
{
    Title = "Sign In",
    Height = 350,
    Width = 500,
    WindowStartupLocation = WindowStartupLocation.CenterScreen,
    WindowStyle = WindowStyle.ToolWindow,
    ResizeMode = ResizeMode.NoResize,
};

window.Content = new SignIn(mainWindowViewModel: this, 
    closeWindowAction: (isCancelled) =>
    {
        window.DialogResult = !isCancelled;
        window.Close();
    });

window.ShowDialog();

вы можете поддерживать некоторую степень слабой связи между вашими моделями представлений и предполагать, что ваш класс виртуальной машины SignIn выглядит примерно так:

public class SignIn
{
    private readonly Action<bool> _closeWindowAction;

    public SignIn(MainWindowViewModel mainWindowViewModel, Action<bool> closeWindowAction)
    {
        _closeWindowAction = closeWindowAction;
    }

    public void CloseWindow(bool isCancelled)
    {
        _closeWindowAction.Invoke(isCancelled);
    }
}

Хотя я не на 100% уверен, почему вы передаете MainWindowViewModelв вашу модель представления SignIn.

Если вы хотите поддерживать чистоту с точки зрения MVVM, я стремлюсь создать интерфейс IDialogService, который можно использовать для отображения окон сообщений, модальных сообщений и т. д. в моих моделях представления- который делегирует создание и управление Window некоторой реализации этой службы.Конечным результатом является то, что модель представления не знает, КАК будет отображаться модальное окно или диалоговое окно.

Если вам интересно - есть библиотеки, которые вы можете использовать, такие как https://github.com/FantasticFiasco/mvvm-dialogs- или сверните свое собственное.

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