首先,当我尝试将Avalon Dock从1.3升级到2.0时,我遇到了这个问题。 无论如何,我有一个ViewModel集合,它使用数据模板,并将每个ViewModel转换为一个单独的选项卡。
所以我有类似的东西。
<ad:DockingManager x:Name="_dockingManager" DocumentsSource="{Binding Scenarios}">
<ad:DockingManager.LayoutItemTemplateSelector>
<local:PanesTemplateSelector>
<local:PanesTemplateSelector.ScenarioMainTemplate>
<DataTemplate >
<TabControl>
<TabItem Header="View1">
<winForm:WindowsFormsHost Name="_host1" />
<TextBlock Text="{Binding SampleText}"/>
</TabItem>
<TabItem Header="View2">
<winForm:WindowsFormsHost Name="_host2" />
</TabItem>
</TabControl>
</DataTemplate>
</local:PanesTemplateSelector.ScenarioMainTemplate>
</local:PanesTemplateSelector>
</ad:DockingManager.LayoutItemTemplateSelector>
<ad:LayoutRoot>
<ad:LayoutPanel Orientation="Vertical" >
<ad:LayoutDocumentPane/>
</ad:LayoutPanel>
</ad:LayoutRoot>
</ad:DockingManager>
那么上面所做的是对于绑定到文档源的每个场景,它将在<ad:LayoutDocumentPane/>
中创建一个新文档。
绑定有效,除了现在我需要在ViewModel端设置winFormHost的子节点。我不知道如何在View Model中做到这一点。但是,SampleText的绑定可以正常工作。
我只需要在视图模型中获取_host1控件并进行设置。
对我来说,这样做看起来不合适/适当的MVVM,因为我觉得我正在玩视图模型中的视图。
有没有替代方法可以做到这一点,或者这次尝试是否正常(如果是这样,我该怎么办?)
谢谢, Kev84
答案 0 :(得分:1)
通常viewmodels和datatemplate通过数据类型属性
连接 <DataTemplate DataType="{x:Type local:MyViewmodelForHost1}">
<winForm:WindowsFormsHost Name="_host1" />
</DataTemplate/>
我不知道你的场景对象是怎样的,但如果我认为它有属性Host1,Host2。
<local:PanesTemplateSelector.ScenarioMainTemplate>
<DataTemplate >
<TabControl>
<TabItem Header="View1">
<ContentPresenter Content="{Binding Host1}"/>
<TextBlock Text="{Binding SampleText}"/>
</TabItem>
<TabItem Header="View2">
<ContentPresenter Content="{Binding Host2}"/>
</TabItem>
</TabControl>
</DataTemplate>
</local:PanesTemplateSelector.ScenarioMainTemplate>
如果host1和2的类型相同,则无效。也许你可以在你的问题中添加一些viewmodel代码。