好吧,有时解决方案就在我的眼皮底下,但我很难看到它......
所以这是我的解决方案:
<Grid>
<Grid >
<UserControl Content="{Binding Path=CurrentViewModel}"/>
</Grid>
<simpleChildWindow:ChildWindow IsOpen="{Binding OpenChildWindows}"
Title="{Binding TitleChildWindows}"
Content="{Binding CurrentWindowsViewModel }"/>
</Grid>
CurrentWindowsViewModel 绑定到一个 UserControl,它完全适合我的 SimpleChildWindows 的 Content 属性。
但是,我必须将所有 ChildWindows 属性绑定到“托管”我的子窗口(“标题”、“IsOpen”等)的 Viewmodel。
所有 ChildWindows ViewModel 都继承自具有 Title 的类 Template(显然继承自 ViewModelBase)以及可能特定于 ChildWindows 的其他一些属性。
我通过 MVVM light Messenger 进行通信,以通过名称告诉“主机”要显示哪个 ViewModel,然后读取其“标题”并通过“IsOpen”属性打开 Windows:
private void ReceiveMessage(EnumViewModelNames viewName)
{
var selectedViewModel = ViewModelList.Where(x => x.ViewModelName == viewName).SingleOrDefault();
if (selectedViewModel is TemplateWindowsViewModel)
{
TitleChildWindows = (selectedViewModel as TemplateWindowsViewModel).Title;
OpenChildWindows = true;
CurrentWindowsViewModel = (selectedViewModel as TemplateWindowsViewModel);
}
else if (selectedViewModel != null)
{
CurrentViewModel = selectedViewModel;
}
Messenger.Default.Unregister<EnumViewModelNames>(this, (action) => ReceiveMessage(action));
}
这样,我可以从“CurrentViewModel”或“MainViewModel”打开 childWindows。
它工作得很好,视图只是一个标准的用户控件,绑定到 ViewModelLocator 中的 DataContext。
对不起,Heorhiy Pavlovych,我看到你很努力,但我们误解了......