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

通常、viewmodel と 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 に答える