Вы можете создать отдельную службу для запуска представления как диалог, так что он может быть использован в общем виде через приложение. И добавит эту услугу в ViewModel через конструктор, который хочет запустить любой диалог.
public interface IDialogWindowService<T>
{
void Show();
void ShowDialog();
}
public class DialogWindowService<T> : IDialogWindowService<T> where T : Window
{
public void Show()
{
container.Resolve<T>().Show();
}
public void ShowDialog()
{
container.Resolve<T>().ShowDialog();
}
}
Вы можете создать отдельную службу для запуска представления как диалог, так что он может быть использован в общем виде через приложение. И добавит эту услугу в ViewModel через конструктор, который хочет запустить любой диалог.
public interface IDialogWindowService<T>
{
void Show();
void ShowDialog();
}
public class DialogWindowService<T> : IDialogWindowService<T> where T : Window
{
public void Show()
{
container.Resolve<T>().Show();
}
public void ShowDialog()
{
container.Resolve<T>().ShowDialog();
}
}
Теперь просто примените эту услугу к соответствующей модели.
public class YourViewModel
{
//commands
public ICommand someCommand { get; set; }
private IDialogWindowService<BookingView> _dialogService;
public YourViewModel(IDialogWindowService<YourView > dialogService)
{
_dialogService = dialogService
someCommand = new RelayCommand(someCommandDoJob,() => true);
}
public void someCommandDoJob(object obj)
{
//Since you want to launch this view as dialog you can set its datacontext in its own constructor.
_dialogService.ShowDialog();
}
}
ИЛИ
вы можете использовать DataTemplates
, чтобы изменить вид.Это позволяет динамически переключаться Views
в зависимости от ViewModel
:
<Window>
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModelA}">
<localControls:ViewAUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModelB}">
<localControls:ViewBUserControl/>
</DataTemplate>
<Window.Resources>
<ContentPresenter Content="{Binding CurrentView}"/>
</Window>
Если Window.DataContext является экземпляр ViewModelA, то ViewA будет отображаться и
Window.DataContext является экземпляром ViewModelB, то ViewB будет будет отображаться.
Лучший пример, который я когда-либо видел и читал, он сделал Рейчел Лим. See the example.
Когда дело доходит до открытия нового окна для MVVM, становится сложнее. Одна из основных причин заключается в том, что 'DataTemplate' не позволяет вам определять внутри класса' Window'. В сети много статей, дающих много разных методов. Я бы предложил сначала попробовать их прочитать. У каждого метода есть свои плюсы и минусы, и, как правило, они не следуют 100% принципам MVVM. – Jai