Я нашел хорошее решение на этом веб-сайте http://www.thesilvermethod.com/Default.aspx?Id=ModalDialogManagerAsimpleapproachtodealingwithmodaldialogsinMVVM
Но пришлось внести некоторые изменения, чтобы интегрировать его в мой код.По пути я получаю некоторые небольшие проблемы, в основном потому, что есть определенные части кода, которые я не получаю полностью.
Как я это сделал, это связал ModalDialogManager со свойством MainWindow типа IDialogViewModel.Затем у меня есть класс WindowsManager, который обрабатывает помещение нужного экземпляра в это свойство.Одним из них является EditDialogViewModel, который предоставляет EditableViewModel этому DialogManager.Я установил представление EditDialog в качестве DataTemplate для этой EditDialogViewModel, но когда я показываю его, новое окно показывает только его часть.
Вот представление:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="EditDataTemplates.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="7*" />
<RowDefinition Height="2*" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<ContentControl Content="{Binding Path=ViewModel}" />
<TextBlock Text="{Binding Path=ViewModel.Error}" />
<UniformGrid Grid.Row="2" Columns="2">
<Button Command="{Binding SaveCommand}" />
<Button Command="{Binding CancelCommand}" />
</UniformGrid>
</Grid>
</UserControl>
Но новый диалогокно показывает только ContentControl, привязанный к свойству ViewModel EditDialogViewModel (оно содержит редактируемую ViewModel).
Я думаю, что это как-то связано с этим кодом в ModelDialogManager:
void Show()
{
if (_window != null) Close();
Window w = new Window();
_window = w;
w.Closing += w_Closing;
w.Owner = GetParentWindow(this);
w.DataContext = this.DataContext;
w.SetBinding(Window.ContentProperty, ""); //This code here does something I don't fully understand
w.Title = Title;
w.Icon = Icon;
w.Height = DialogHeight;
w.Width = DialogWidth;
w.ResizeMode = DialogResizeMode;
w.ShowDialog();
}
Он применяет привязку там, но я думаю, что это только первый ContentControl, который связывается или что-то в этом роде.Это довольно сложно.
Другая проблема заключается в том, что мышь просто не работает внутри модального диалога.Я могу вкладывать в текстовые поля, но не нажимать на них.
Есть ли способ исправить это или лучший способ обработки диалоговых окон Modal в WPF?
EDIT
Хорошо, я собираюсь это признать.Я огромный идиот.Это было так просто, я просто не мог этого увидеть.Я установил Высота и Ширина в UserControl на фиксированное значение, в то время как я все еще возился с тем, что это окно.Так что на самом деле это показывало все, просто не было места.Я понятия не имею, почему мышь не работала в этот момент, но теперь она работает отлично.