gpt4 book ai didi

wpf - 如何在 WPF 组合框中为下拉列表值/所选项目显示不同的值?

转载 作者:行者123 更新时间:2023-12-03 23:25:19 25 4
gpt4 key购买 nike

我有一个 WPF 组合框绑定(bind)到具有长描述的项目列表。

绑定(bind)到 ComboBox 的类型具有作为属性的短描述和长描述。目前,我对完整描述具有约束力。

comboBox.DisplayMemberPath = "FullDescription";

如何保证当item被选中并在combobox中显示为单个item时,会显示为 ShortDescription的值属性,而下拉菜单将显示 FullDescription ?

最佳答案

更新 2011-11-14

我最近再次遇到了同样的要求,我对下面发布的解决方案不太满意。这是一种更好的方法来获得相同的行为,而无需重新模板 ComboBoxItem .它使用 DataTemplateSelector
首先,指定正则 DataTemplate ,下拉列表DataTemplateComboBoxItemTemplateSelectorComboBox 的资源中.然后引用 ComboBoxItemTemplateSelector作为 DynamicResource对于 ItemTemplateSelector

<ComboBox ...
ItemTemplateSelector="{DynamicResource itemTemplateSelector}">
<ComboBox.Resources>
<DataTemplate x:Key="selectedTemplate">
<TextBlock Text="{Binding Path=ShortDescription}"/>
</DataTemplate>
<DataTemplate x:Key="dropDownTemplate">
<TextBlock Text="{Binding Path=FullDescription}"/>
</DataTemplate>
<local:ComboBoxItemTemplateSelector
x:Key="itemTemplateSelector"
SelectedTemplate="{StaticResource selectedTemplate}"
DropDownTemplate="{StaticResource dropDownTemplate}"/>
</ComboBox.Resources>
</ComboBox>
ComboBoxItemTemplateSelector检查容器是否是 ComboBoxItem 的子容器,如果是,那么我们正在处理一个下拉项,否则它是 ComboBox中的项.
public class ComboBoxItemTemplateSelector : DataTemplateSelector
{
public DataTemplate DropDownTemplate
{
get;
set;
}
public DataTemplate SelectedTemplate
{
get;
set;
}
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
ComboBoxItem comboBoxItem = VisualTreeHelpers.GetVisualParent<ComboBoxItem>(container);
if (comboBoxItem != null)
{
return DropDownTemplate;
}
return SelectedTemplate;
}
}

获取VisualParent
public static T GetVisualParent<T>(object childObject) where T : Visual
{
DependencyObject child = childObject as DependencyObject;
while ((child != null) && !(child is T))
{
child = VisualTreeHelper.GetParent(child);
}
return child as T;
}

旧解决方案,需要重新模板 ComboBoxItem
<SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" />
<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />

<ControlTemplate x:Key="FullDescriptionTemplate" TargetType="ComboBoxItem">
<Border Name="Border" Padding="2" SnapsToDevicePixels="true">
<StackPanel>
<TextBlock Text="{Binding Path=FullDescription}"/>
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

<ComboBox Name="c_comboBox" ItemsSource="{Binding}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=ShortDescription}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="Template" Value="{StaticResource FullDescriptionTemplate}" />
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>

这会导致以下行为

alt text

关于wpf - 如何在 WPF 组合框中为下拉列表值/所选项目显示不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com