4

アプリケーションでビルドするために、MVVM アーキテクチャと MEF を使用しようとしています。アプリケーションをできるだけ一般的な方法でユーザーに表示できるようにするためにDataTemplatesandを使用したいと考えています。ContentControls

そのため、ユーザーが情報を読み書きし、XML やデータベースなどのどこかに結果を読み書きできる機能を作成しています。だから私は2つのインターフェースを持っていIResultStorageますITestStorage

ユーザーがこれらの設定を更新するためのページを作成したいので、ファイルの場所やデータベースなどを作成します。ビューモデルは MEF 経由でそれらをインポートします。

public sealed class AdminViewModel : ViewModelBase
{
    [Import]
    public ITestStorage TestStorage { get; set; }

    [Import]
    public IResultStorage ResultStorage { get; set; }
}

次に、ビューがエクスポートされ、Resources.MergedDictionaries実行時にロードされます

<DataTemplate DataType="{x:Type vm:AdminViewModel}">
    <Grid>
        <TabControl Grid.Row="0">
            <TabItem Header="Tests">
                <ContentControl Grid.Row="0" Content="{Binding TestStorage}"/>
            </TabItem>
            <TabItem Header="Results">
                <ContentControl Grid.Row="0" Content="{Binding ResultStorage}"/>
            </TabItem>
        </TabControl>
    </Grid>
</DataTemplate>

ただし、現在実装している方法は、1 つのクラスがこれらの両方を継承しており、これが問題を引き起こしていることです。

[Export(typeof(ITestStorage))]
[Export(typeof(IResultStorage))]
public sealed class XmlStorage : ITestStorage, IResultStorage { ... }

したがって、AdminViewModel上記の両方ContentControlsが描画されると、タイプのように見えるので、適切に描画するXmlStorageための作成方法がわかりません。DataTemplates

うまくいけば、これは理にかなっていますが、私が完全に間違った方法で行った場合は、知っておくとよいでしょう.

4

2 に答える 2

1

リソースとしてそれぞれのサブデータテンプレートを作成するかどうかをテストしましたか?

<DataTemplate DataType="{x:Type vm:TestStorage}">
    <Grid>
        <Label Content="{Binding someValueFromTestStorage}"/>
    </Grid>
</DataTemplate>

編集

たぶん、この2つのリンクがあなたを助けるかもしれませ

Beatriz Costa - MSFT (パートナー)に従ってください。

于 2013-03-11T13:24:21.297 に答える
1

よりトリッキーな実装については、よりインテリジェントな実装と呼びましょうTemplateSelector。詳細については、こちらをご覧ください。

特定の VM またはビジネス オブジェクトのタイプに基づいて、テンプレートを割り当てることができます。直面する唯一の課題は、オブジェクトが に渡される「役割」を見つけなければならないという事実ですTemplateSelector

追加情報

これも役立つと思います。

于 2013-03-11T09:07:46.537 に答える