Заполняя здесь довольно много пробелов, но, предполагая, что 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- или сверните свое собственное.