Mat*_*ský 13 wpf xaml datatemplate
我有一个ComboBox相当复杂的单个项目模板,其中包括两个图像和几行文本:

但是,ComboBox本身所选项目无法正确显示,因为垂直空间太有限(我无法使其更高,因为它是a的一部分ToolBar).
如何让ComboBox为ComboBox自己显示的项目使用不同的模板?(默认ToString表示会很好)
谢谢!
H.B*_*.B. 28
所选项目(在ComboBox本身,而不是下拉列表中)不在内部,ComboBoxItem因此您可以执行以下操作:
<ComboBox.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<!-- Complex default template -->
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Image Source="{Binding XPath=media:thumbnail/@url}" Width="100" Height="100" />
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<!-- Simple selection box template -->
<DataTrigger
Binding="{Binding RelativeSource={RelativeSource AncestorType=ComboBoxItem}}"
Value="{x:Null}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding XPath=title}" />
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</ComboBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)
(编辑:请注意,选择框中的绑定会抛出错误,因为RelativeSource找不到.有各种绕过这个的选项,一个是自定义值转换器返回true或false取决于祖先是否存在(手动树行走) .)
我正在寻找这个问题的标准(不是hacky,没有绑定错误)解决方案.我在这里找到了:使用DataTemplateSelector.
这与@HB答案的想法相同:只要ComboBoxItem在可视树中有父作为父母,就检查.
public class ComboBoxItemTemplateSelector : DataTemplateSelector
{
public DataTemplate SelectedTemplate { get; set; }
public DataTemplate DropDownTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
while (container != null)
{
container = VisualTreeHelper.GetParent(container);
if (container is ComboBoxItem)
return DropDownTemplate;
}
return SelectedTemplate;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
<ComboBox.ItemTemplateSelector>
<local:ComboBoxItemTemplateSelector>
<local:ComboBoxItemTemplateSelector.SelectedTemplate>
<DataTemplate>
... simple template for selected item
</DataTemplate>
</local:ComboBoxItemTemplateSelector.SelectedTemplate>
<local:ComboBoxItemTemplateSelector.DropDownTemplate>
<DataTemplate>
... complex template used by dropdown items
</DataTemplate>
</local:ComboBoxItemTemplateSelector.DropDownTemplate>
</local:ComboBoxItemTemplateSelector>
</ComboBox.ItemTemplateSelector>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6813 次 |
| 最近记录: |