我似乎无法为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}"
/>
我可以使它起作用的唯一方法是从ItemContainerStyle中删除ContentPresenter,并将其替换为我的自定义模板(ComboBoxItemTemplate)的内容。但是我不认为应该使用这种方法,因为这将意味着ContentPresenter不再存在(并且ComboBox中的代码可能依赖于它)。
在显示具有不同下拉列表和所选模板的组合框时提供的任何帮助将不胜感激!
最佳答案
ComboBox.ItemTemplate只是设置ComboBoxItem.ContentTemplate的便捷方法。因此,上面的代码基本上尝试两次设置ComboBoxItem.ContentTemplate。
正如Jobi指出的那样,您可以尝试仅使用自定义样式。如果您始终知道内容的类型,则可以安全地排除ContentPresenter。 ContentPresenter仅允许您使用DataTemplate显示一些随机数据。但是您可以将其替换为TextBlock和Image。您只是失去了指定DataTemplate的能力。
Jobi方法的问题在于,即使在下拉菜单中,选择项也不会显示其图像。实际上,所选项目显示在两个位置(下拉列表和ComboBox的主体)。在一个位置,您需要一个DataTemplate,在另一个位置,您需要另一个DataTemplate。
最好的选择是重新设置ComboBox的样式。您可以从here获取默认样式。有一个名为“ContentPresenter”的ContentPresenter。您需要:
当在ComboBox的主体中显示所选项目时,这有效地忽略了ComboBoxItem.ContentTemplate,但在下拉列表中显示ComboBoxItem时将使用它。
关于.net - 如何在Silverlight的组合框中为选定状态和下拉状态使用其他模板?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/271569/