6

ComboBoxItem の ContentTemplate を設定できないようです。私がこれをやろうとしている理由は、コンボ ボックスに自分のデータを 2 つ表示したいからです。コンボ ボックスが開いている (メニューがダウンしている) 場合、テキスト ボックス (画像の名前) とその下に画像コントロールが必要です。アイテムを選択すると、コンボ ボックスに画像の名前を含むテキスト ボックスが表示されます。

これは、ComboBox の ItemTemplate と ItemContainerStyle を変更することで実現できると考えました。ItemContainerStyle には、次の ContentPresenter が含まれています。

<ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="contentPresenter" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>

したがって、ここで ContentTemplate を設定するだけで機能すると想定しました。しかし、私はそれを機能させることができないようです:

<DataTemplate x:Key="ComboBoxDataTemplate">
            <Grid>
                <TextBlock Text="{Binding Path='Name'}"/>
            </Grid>
        </DataTemplate>

<DataTemplate x:Key="ComboBoxItemTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Path='Name'}"/>
                <Image Source="{Binding Path='Source'}" Width="64" Height="64"/>
            </StackPanel>
        </DataTemplate>

        <Style x:Key="ComboBoxItemStyle1" TargetType="ComboBoxItem">
...
            <Setter Property="ContentTemplate" Value="{StaticResource ComboBoxItemTemplate}"/>

...

これが私のコンボボックスです:

<ComboBox Width="70" Margin="3,0,0,0"
                        ItemsSource="{StaticResource Source}"
                        ItemTemplate="{StaticResource ComboBoxDataTemplate}"
                        ItemContainerStyle="{StaticResource ComboBoxItemStyle1}"
                        />

これを機能させる唯一の方法は、ContentPresenter を ItemContainerStyle から削除し、それをカスタム テンプレート (ComboBoxItemTemplate) のコンテンツに置き換えることです。しかし、ContentPresenter が存在しなくなったことを意味するため、このアプローチを使用する必要があるとは思いませんでした (また、ComboBox 内のコードは既存のものに依存している可能性があります)。

別のドロップダウンと選択されたテンプレートを使用してコンボ ボックスを表示する際のヘルプをいただければ幸いです。

4

3 に答える 3

5

ComboBox.ItemTemplate は、ComboBoxItem.ContentTemplate を設定する便利な方法です。したがって、上記のコードは基本的に ComboBoxItem.ContentTemplate を 2 回設定しようとします。

Jobi が指摘したように、カスタム スタイルだけを使用してみることができます。コンテンツのタイプが常にわかっている場合は、ContentPresenter を安全に除外できます。ContentPresenter を使用すると、DataTemplate を使用してランダム データを表示できます。ただし、TextBlock と Image に置き換えることもできます。DataTemplate を指定できなくなるだけです。

Jobi のアプローチの問題点は、選択した項目がドロップダウンにある場合でも、その画像が表示されないことです。実際に、選択された項目は 2 つの場所 (ドロップダウンと ComboBox の本体) に表示されます。ある場所では 1 つの DataTemplate が必要で、別の場所では別の DataTemplate が必要です。

あなたの最善の策は、ComboBox のスタイルを変更することです。ここからデフォルトのスタイルを取得できます。「ContentPresenter」という名前の ContentPresenter があります。次のことを行う必要があります。

  1. ComboBox が Content/ContentTemplate プロパティを自動的に設定しないように、ContentPresenter の名前を削除/変更します。
  2. 「{TemplateBinding SelectedObject}」のように ContentPresenter.Content プロパティをバインドします。
  3. Image なしで ContentPresenter.ContentTemplate プロパティを DataTemplate に設定します。
  4. ComboBox.ItemTemplate プロパティを、Image と TextBlock を使用して DataTemplate に設定します。
  5. x:Key="MyComboBoxStyle" のように、ComboBox スタイルに明示的なキーを指定します。
  6. Style="{StaticResource MyComboBoxStyle}" のように、ComboBox で Style を使用します。

これは、選択した項目を ComboBox の本体に表示するときに ComboBoxItem.ContentTemplate を効果的に無視しますが、ComboBoxItem をドロップダウンに表示するときに使用します。

于 2010-09-14T11:42:55.937 に答える
0

DataTemplateは主にデータの視覚化用です。すべてのUI関連のダイナミクスをControlTemplate(コントロールビヘイビアー)内に指定することをお勧めします。ContentPresenterがない場合、潜在的な問題はありません。唯一の問題は、このControlTemplateを他のComboBoxから再利用する場合です。次に、ContentPresenterを使用して別のクリーンなコントロールテンプレートを宣言できます。

于 2008-11-20T21:59:09.220 に答える
0

これは、ItemsContainerStyle だけで実現できます。ContentPresenter の代わりに TextBlock と Image を追加します。VisualStateManager を追加し、VSM の Selected State に基づいて Image コントロールの Visibility を切り替えます。

于 2008-11-07T10:26:14.717 に答える