1

さて、私はこれをたくさん検索しましたが、正しい質問に頭を悩ませているように見えないか、それが終わっていません...

基本的に、さまざまなデータ駆動型の「アプレット」を含むモジュラーアプリケーションがあります。これは、ユーザーに提供されたアクセス許可に基づいて変更される可能性があり、動的に追加される可能性があります。私はすでにこのアプリケーションを Flex で構築しており、MVVM を介して WPF に移行しています。これは、コーディングと保守が 100 万倍も簡単だからです。

今、私が理解しようとしている2つの問題があります:

問題#1

バインディングを通じて単一のコントロールを動的に追加できる必要があります。私はすでに、ViewModel 内のオブジェクトのリストに接続する ItemsControls のデータ テンプレートを使用してバインディングを構築しており、それは素晴らしく機能しますが、コントロールが 1 つしかないことを知っていると、そのシステムは少しハックに見えますが、それは私を取得しますとりあえず。

これが私にとってハックに見える理由を示すための私のコードです:

XAML

<ItemsControl ItemsSource="{Binding ApplicationList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CTRL:PortalApplicationControl />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ビューモデル

/// <summary>
/// A List to contain the currently active application for binding to the ItemsControl in XAML
/// </summary>
public List<Models.Application> ApplicationList
{
    get { return (List<Models.Application>)GetValue(ApplicationListProperty); }
    set { SetValue(ApplicationListProperty, value); }
}
public static readonly DependencyProperty ApplicationListProperty =
    DependencyProperty.Register("ApplicationList", typeof(List<Models.Application>), typeof(ApplicationVM));

/// <summary>
/// The currently active application
/// </summary>
public Models.Application Application
{
    get { return (Models.Application)GetValue(ApplicationProperty); }
    set { SetValue(ApplicationProperty, value); ApplicationList = new List<Models.Application>() { Application }; }
}
public static readonly DependencyProperty ApplicationProperty =
    DependencyProperty.Register("Application", typeof(Models.Application), typeof(ApplicationVM));

ご覧のとおり、Application 依存関係プロパティのプロパティにバインドされているオブジェクトは '{Binding Application.Name}' を呼び出すことができますが、ItemsControl は '{Binding ApplicationList}' とセッターを呼び出す必要があるという意味でハックです。アプリケーションは長さ 1 の新しい「リスト」をインスタンス化して ApplicationList オブジェクトを順番に設定する必要があるため....動作しますが、あまり洗練されていないため、このタスクを達成する別の方法があるかどうかを知りたいです。

問題#2

さて、上記の構造全体にモンキー レンチを投げる部分に到達しました。現在アクティブな Application オブジェクトに基づいて、データ テンプレートに異なるコントロールが必要な場合はどうすればよいでしょうか? IE Application1 が現在アクティブな場合は Application1View を使用しますが、Application2 が現在アクティブな場合は Application2View を使用します...これを機能させるには、コード ビハインドで何らかの作業を行う必要があるようです...そして、それは私を襲います私がMVVM構造に固執しているなら、大したことはありません

長々と申し訳ありませんが、質問が理にかなっていることを願っています。皆さんが提供できる助けに感謝します...これは、上記の問題を解決できるまで私のプロジェクトを停止させます

4

2 に答える 2

2

DataTemplateSelectorが役立つ場合があります。

于 2013-04-05T17:51:23.280 に答える