使用DataTemplates for View Model。

时间:2012-07-09 20:58:07

标签: .net wpf mvvm datatemplate avalondock

首先,当我尝试将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

1 个答案:

答案 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代码。