12

XAML の DataTemplate をネストされたクラスに関連付けることはできますか?

私は MVVM アプリケーションに取り組んでおり、データ テンプレートの問題に遭遇しました。アイテム コントロールの他のビュー モデルのコレクションを提供するビュー モデルがあります。これらの項目は、外側のビュー モデルでネストされたクラスとして定義された階層の一部です。これまでのところ、内部の入れ子になったクラスを参照するために XAML でマッピングを作成できませんでした。

クラス階層は次のとおりです (簡潔にするために簡略化しています)。

public class MainViewModel
{
    public class A
    {
    }

    public class B : A
    {
    }

    public class C : A
    {
    }

    public ObservableCollection<A> Items
    {
        get;
        set;
    }
}

XAML で、DataTemplate をタイプ B および C にマップしようとしていますが、ネストされたクラス名を完全に修飾することはできません。

<ItemsControl ItemsSource="{Binding Path=Items}">
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type ns:BracingViewModel.B}">
            <Grid>
            ....
            </Grid>
        </DataTemplate>
        <DataTemplate DataType="{x:Type ns:BracingViewModel.C}">
            <Grid>
            ....
            </Grid>
        </DataTemplate>
    </ItemsControl.Resources>
</ItemsControl>

問題: ネストされたクラスへの参照は、XAML でビルド エラーとして表示されます。私は以下を取得します:

Error   5   Cannot find the type 'ns:B'. Note that type names are case sensitive. Line...

Error   5   Cannot find the type 'ns:C'. Note that type names are case sensitive. Line...

A、B、C クラスの階層を MainViewModel クラスの外側 (名前空間レベル) に移動すると、問題なく動作します。

一般的な習慣として、ネストされたクラスとして定義されたビューモデルに関連するクラスを保持しようとしますが、それがこの問題につながります。

それで、私の質問: DataTemplate をネストされたクラスに関連付けることさえ可能ですか? もしそうなら、それは XAML 部分でどのように行われますか?

前もって感謝します... ジョー

4

1 に答える 1

34

これは私のために働く:

 <ItemsControl ItemsSource="{Binding Path=Items}">
        <ItemsControl.Resources>
            <DataTemplate DataType="{x:Type ns:MainViewModel+B}">
                <Grid Background="Blue"
                      Width="30"
                      Height="30">

                </Grid>
            </DataTemplate>
            <DataTemplate DataType="{x:Type ns:MainViewModel+C}">
                <Grid Background="Chartreuse" Width="30" Height="30">

                </Grid>
            </DataTemplate>
        </ItemsControl.Resources>
    </ItemsControl>

つまり、マークアップ拡張機能で.to+を変更するだけですx:Type

クレジット:このスレッド

于 2012-10-09T19:36:48.073 に答える