0

首先,我在尝试将 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 的子节点。而且我不知道如何在视图模型中做到这一点。SampleText 的绑定虽然有效。

我只需要在视图模型中获取 _host1 控件并进行设置。

对我来说,这样做似乎不正确/正确的 MVVM,因为感觉就像我在玩视图模型中的视图。

有没有其他方法可以这样做,或者这种尝试是否可以(如果可以,我该怎么做?)

谢谢,Kev84

4

1 回答 1

1

通常 viewmodels 和 datatemplate 是通过 datatype 属性连接的

 <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 是同一类型,这不起作用。也许您可以在您的问题中添加一些视图模型代码。

于 2012-07-10T05:50:44.467 回答