2

我的 WPF 窗口 ComboBoxes 有一个自定义模板,它显示从 ComboBoxItem 继承的项目,这些项目也有一个 Image 属性(以便我的项目可以显示文本和图像)。对于任何给定项目,组合框的弹出菜单中的文本和图像都按预期显示,但我无法在当前选定的项目中显示图像。

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 的“图像”属性。

我尝试了该 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 的内容。我不知道为什么会这样,也不知道为什么它没有触发任何运行时错误,但我发现通过绑定到 ComboBox 的 SelectedItem 属性而不是 ContentPresenter 中的 SelectionBoxItem 允许我访问用户定义的属性。

于 2012-07-23T03:09:33.967 回答
0

DataTemplate 甚至可以工作吗?据我所知,任何可以呈现的 WPF 元素都不会使用 DataTemplate。并且您的自定义 ComboBoxItem 可以在没有 DataTemplate 的情况下呈现。

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

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

{绑定路径=Image,RelativeSource={RelativeSource AncestorType={x:Type SB:SBComboBoxItem}}

或作为带有 Content.Image 的 TemplatedParent 的 RelativeSource

于 2012-07-22T19:00:14.180 回答
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>

于 2012-07-22T20:17:34.967 回答