2

答える前に:この質問は、WPF のListViewコントロール (とGridView) に関するものです。これは、WPF のコントロール、ASP.NETまたはコントロール、または WinFormまたはコントロールに関するものではありません。それらはすべて非常に似ているように聞こえ、しばしば混同されますが、間違ったタイプのコントロールに対する回答は私にとって役に立たず、さらに重要なことに、あなたが回答を書くのに費やした時間の無駄であり、無駄にすべきではないと私は信じています.DataGridDataGridListViewDataGridViewListView


ビューモデルのプロパティにバインドされたいくつかの列を持つコントロールListViewがあります。(インラインまたはリソースを介して) を指定することで、 のセルのGridView外観を簡単にカスタマイズできます。GridViewColumnCellTemplate

これで、ビューモデルに特定のプロパティがあります。その型は抽象基本クラスであり、その値はいくつかの派生型のいずれかになります。各派生型はDataTemplate、セル内で異なる必要があります。幸いなことに、私が望んでいることを正確に行う がありますが、配管コードを書く必要がありますGridViewColumnCellTemplateSelectorしかし、そのページを見ると、次のように書かれDataTemplateSelectorています。

異なる型のオブジェクトがある場合は、DataTemplate で DataType プロパティを設定できることに注意してください。その場合、DataTemplateSelector を作成する必要はありません。[...] 詳細については、「データ テンプレートの概要」を参照してください。

万歳!配管コードを書く必要はありません。私のタイプ違うので、これは完璧にフィットするようです. しかし、残念ながら、データバインドされた列の 1 つの特定の派生型 ( を使用してバインド) に一致する a で a を定義した後でも、効果はDataTemplateありませんでした。DataTypeGridViewColumnDisplayMemberBinding

DataTemplateGridView. -targetedは単に と互換性がありDataTypeませんか? それらを使用する方法はありますか、または指定する必要がありますか? 's内に複数の s を指定して、プロパティが効果を持つようにする方法があるのではないでしょうか?DataTemplatesGridViewCellTemplateSelectorDataTemplateGridViewColumnCellTemplateDataType

4

2 に答える 2

7

ViewModelsWPF を使用すると、論理ツリーなどにオブジェクトを挿入できますがDataTemplate、ビジュアル ツリーを描画するときに指定したオブジェクトを描画する方法を WPF に指示するために を使用できます。

暗黙的DataTemplateは定義済み (no )DataTemplateのみを持つ であり、WPF が VisualTree で指定された型のオブジェクトをレンダリングしようとするたびに自動的に使用されます。DataTypex:Key

だから、あなたが使用することができます

<Window.Resources>

    <DataTemplate DataType="{x:Type local:ViewModelA}">
        <local:ViewA />
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:ViewModelB}">
        <local:ViewB />
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:ViewModelC}">
        <local:ViewC />
    </DataTemplate>

</Window.Resources>

ViewModelA を ViewA で、ViewModelB を ViewB で、ViewModelC を ViewC で描画するように WPF に指示します。

これをウィンドウ全体ではなく GridView にのみ適用する場合は、指定できます<GridView.Resources>(または<ListView.Resources>、どれか思い出せません)。

を使用して列をバインドしている場合、値がプロパティにバインドさDisplayMemberBindingれた としてレンダリングされることに注意してください。TextBoxTextYourViewModel.ToString()DataTemplate

それを避けるには、 を にバインドされたプロパティで のCellTemplateようなものに設定するだけで、暗黙的に ViewModel を使用してレンダリングされます。ContentPresenterContentViewModelDataTemplates

<GridViewColumn Header="Some Header">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <ContentPresenter Content="{Binding YourViewModelProperty}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>
于 2012-09-19T19:45:45.167 に答える
1

プロパティの実装DisplayMember*はがらくたです。なぜ彼らが a のTextBlock代わりに aをバインドするのContentPresenterが良い考えだと思ったのかわかりません。

これをオーバーライドするには、添付プロパティまたはそれぞれのプロパティを持つサブクラスをお勧めします。対象のプロパティにバインドされたをDataTemplate含む を作成するだけで、暗黙的な が可能になります。この遅延は、列の として割り当てる必要があります。ContentPresenterContentDataTemplatingDataTemplateCellTemplate

于 2012-09-20T19:19:12.943 に答える