在ComboBox的选定项目中显示图像

时间:2012-07-22 18:52:22

标签: c# wpf xaml combobox datatemplate

我的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>

3 个答案:

答案 0 :(得分:1)

尽管我使用DataTemplate通过DataTemplate的DataType属性公开我选择的组合框项的基础类型,但我的ComboBox的SelectionBoxItem属性显然返回了一些无法转换为我的自定义ComboBoxItem的属性。我不知道为什么会这样,也不知道为什么它没有解决任何运行时错误,但我发现通过绑定到ComboBox的SelectedItem属性而不是ContentPresenter中的SelectionBoxItem,我可以访问用户定义的属性。

答案 1 :(得分:0)

DataTemplate甚至可以工作吗?到目前为止,我记得,任何可以渲染的WPF元素都不会使用DataTemplate。而且您的自定义ComboBoxItem可以在没有DataTemplate的情况下呈现。

所以第一个问题是,DataTemplate是否应用了? (只需更改DataTemplates网格的背景,并找出它,如果有效)。

让我们假设DataTemplate实际上有效,我会尝试:

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

或具有Content.Image的TemplatedParent的RelativeSource

答案 2 :(得分:0)

好的,在DataTemplate部分,您必须绑定Image的Source属性,而不是Image对象本身。

像这样:

<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>