2

WPF ウィンドウ ComboBoxes のカスタム テンプレートがあります。これは、ComboBoxItem から継承され、Image プロパティも持つ項目を表示します (項目がテキストと画像の両方を表示できるようにするため)。テキストと画像の両方が、特定のアイテムの ComboBox のポップアップ メニューに期待どおりに表示されますが、現在選択されているアイテムに画像を表示できませんでした。

現在選択されている項目を表示する ComboBox テンプレート内の ContentPresenter には、その Content プロパティが {TemplateBinding SelectionBoxItem} に適切にバインドされており、その ContentTemplate は次の静的リソースにバインドされています。

    <DataTemplate x:Key="SelectionBoxItemTemplateTextAndImage" DataType="{x:Type SB:SBComboBoxItem}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Image Source="{Binding Image}"/>
            <TextBlock Grid.Column="1" Text="{Binding}"/>
        </Grid>
    </DataTemplate>

SBComboBoxItem は、ComboBox から継承し、DependencyProperty として適切に登録された「Image」プロパティを含むカスタム コントロールです。

以下を使用するなど、その DataTemplate の代替実装を試みました。

{Binding Path=Image, RelativeSource={RelativeSource TemplatedParent}}

画像のソースとして。TextBlock の Text プロパティを次のように設定すると、テキストは引き続き表示されますが、機能しませんでした。

{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}

私は遊んでみて、テキストを表示する多数の実装を見つけましたが、同等のものは画像では機能しません。画像とテキストの両方を表示するようにポップアップを設定するのは簡単だったので、これが機能しない理由がわかりません。

編集:私が何か間違ったことをした場合に備えて、画像を処理するために ComboBoxItem に追加された機能があります:

    public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("Image", typeof(Image), typeof(SBComboBoxItem));
    public Image Image { get { return (Image)GetValue(ImageProperty); } set { SetValue(ImageProperty, value); } }

そして、ここにアイテムが追加された ComboBox があります。

<ComboBox SelectedIndex="1">
    <SB:SBComboBoxItem Content="Text">
        <SB:SBComboBoxItem.Image>
            <Image Source="..\Images\Table.png"/>
        </SB:SBComboBoxItem.Image>
    </SB:SBComboBoxItem>
    <SB:SBComboBoxItem Content="MoreText">
        <SB:SBComboBoxItem.Image>
            <Image Source="..\Images\Euclidian.png"/>
        </SB:SBComboBoxItem.Image>
    </SB:SBComboBoxItem>
</ComboBox>
4

3 に答える 3

1

DataTemplate を使用して、選択したコンボボックス項目の基になる型を DataTemplate の DataType プロパティを介して公開していたという事実にもかかわらず、ComboBox の SelectionBoxItem プロパティは、明らかにカスタム ComboBoxItem としてキャストできないものを返していました。これがなぜなのか、なぜ実行時エラーが発生しなかったのかはわかりませんが、ContentPresenter の SelectionBoxItem の代わりに ComboBox の SelectedItem プロパティにバインドすることで、ユーザー定義のプロパティにアクセスできることがわかりました。

于 2012-07-23T03:09:33.967 に答える
0

DataTemplate も機能しますか? 私が覚えている限り、レンダリングできる WPF 要素は DataTemplate を使用しません。また、カスタム ComboBoxItem は、DataTemplate なしでレンダリングできます。

最初の質問は、DataTemplate が適用されているかどうかです。(DataTemplates のグリッドの背景を変更して、それが機能するかどうかを確認してください)。

DataTemplate が実際に機能すると仮定しましょう。

{Binding Path=Image, RelativeSource={RelativeSource AncestorType={x:Type SB:SBComboBoxItem}}

または Content.Image を持つ TemplatedParent としての RelativeSource

于 2012-07-22T19:00:14.180 に答える
0

さて、DataTemplate 部分では、Image 自体ではなく、Image の Source プロパティに対してバインドする必要があります。

そのようです:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <BitmapImage x:Key="validImg" UriSource="test.png" />

    <DataTemplate  x:Key="TEMP" DataType="ComboBoxItem">
        <StackPanel Orientation="Horizontal">

            <!--Not working Content(Image) is not valid for Source property I think-->
            <Image Source="{Binding Path=Content}" />
            <!--Working -->
            <Image Source="{Binding Path=Content.Source}" />
            <TextBlock Text="{Binding Path=Content}" />
        </StackPanel>
    </DataTemplate>
</Window.Resources>

<Grid>
    <ContentPresenter 
        Content="{Binding Items[0], ElementName=test}"
        ContentTemplate="{StaticResource TEMP}">
    </ContentPresenter>

    <ComboBox x:Name="test" Height="50" Margin="0, 50, 0, 0">
        <ComboBoxItem >
            <ComboBoxItem.Content>
                <Image Source="{StaticResource validImg}" />
            </ComboBoxItem.Content>
        </ComboBoxItem>
    </ComboBox>
</Grid>

于 2012-07-22T20:17:34.967 に答える