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