gpt4 book ai didi

wpf - ComboBox ItemTemplate 仅在下拉列表中工作

转载 作者:行者123 更新时间:2023-12-03 12:45:39 31 4
gpt4 key购买 nike

我试图显示一个 ComboBox,其 ItemsSource 是控件的集合(它是 PropertyGrid 的一部分,ComboBox 应该显示控件的名称,并且用户应该能够选择其中一个控件)。这是该问题的极其简化的再现:

<ComboBox ItemsSource="{Binding GroupBoxes}" SelectedValue="{Binding SelectedGroupBox}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>

GroupBoxes 和 SelectedGroupBox 是 ObservableCollection 和 GroupBox 类型的 DependencyProperties。

绑定(bind)工作 - 控件名称显示在 ComboBox-DropDown 中,如果我选择不同的项目,我可以看到 SelectedGroupBox 属性已正确更新。问题:所选项目永远不会显示在 ComboBox 中。从代码设置 SelectedGroupBox 属性也可以按预期工作 - ComboBox 引发 SelectionChanged 并且其 SelectedValue 是正确的,但它仍然不显示当前值。

如果我对任何其他类型的类(class)做同样的事情,一切都会按预期工作。

在寻找答案时,我遇到了许多具有类似声音问题的人的帖子,但几乎所有帖子都是绑定(bind)问题,而这里并非如此。

编辑:

为了简化尝试,这里是背后的代码。只需将上面的 XAML 放在一个新窗口中,并将下面的代码放在后面的代码中。
public MainWindow() {
InitializeComponent();
this.DataContext = this;
this.GroupBoxes = new ObservableCollection<GroupBox>();
this.GroupBoxes.Add(new GroupBox() { Name = "AAA", Header = "AAA", Height = 100, Background = Brushes.Purple });
this.GroupBoxes.Add(new GroupBox() { Name = "BBB", Header = "BBB", Height = 100, Background = Brushes.Purple });
this.GroupBoxes.Add(new GroupBox() { Name = "CCC", Header = "CCC", Height = 100, Background = Brushes.Purple });
this.GroupBoxes.Add(new GroupBox() { Name = "DDD", Header = "DDD", Height = 100, Background = Brushes.Purple });
this.GroupBoxes.Add(new GroupBox() { Name = "EEE", Header = "EEE", Height = 100, Background = Brushes.Purple });
}

#region GroupBoxesProperty

public static readonly DependencyProperty GroupBoxesProperty = DependencyProperty.Register(
"GroupBoxes", typeof(ObservableCollection<GroupBox>), typeof(MainWindow)
);

public ObservableCollection<GroupBox> GroupBoxes {
get { return (ObservableCollection<GroupBox>)GetValue(GroupBoxesProperty); }
set { SetValue(GroupBoxesProperty, value); }
}

#endregion

#region SelectedGroupBoxProperty

public static readonly DependencyProperty SelectedGroupBoxProperty = DependencyProperty.Register(
"SelectedGroupBox", typeof(GroupBox), typeof(MainWindow),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, (s, e) => (s as MainWindow).OnSelectedGroupBoxChanged())
);

public GroupBox SelectedGroupBox {
get { return (GroupBox)GetValue(SelectedGroupBoxProperty); }
set { SetValue(SelectedGroupBoxProperty, value); }
}

void OnSelectedGroupBoxChanged() {
Console.WriteLine("selection is now " + this.SelectedGroupBox.Name);
}

#endregion

最佳答案

由于某些非常复杂的原因,ComboBox 公开了一个名为 SelectionBoxItem 的只读属性。 ComboBox 模板中的内容展示器绑定(bind)在此属性上。正是 SelectionBoxItem 公开了非 UI 元素的字符串表示,允许您查看所选值。使用此属性可以防止内容呈现器使用数据模板。这就是模板适用于下拉列表但不适用于所选项目的原因。这是导致问题的默认 ComboBox 模板的一部分:

<ContentPresenter IsHitTestVisible="false"
Margin="8,1,1,1"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

但是,您可以创建自己的 ComboBox 样式,该样式覆盖默认 ContentPresenter 并使用 SelectedItem 代替 SelectionBoxItem 和 ItemTemplate 代替 SelectionItemBoxTemplate。这将解决问题。

关于wpf - ComboBox ItemTemplate 仅在下拉列表中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8242312/

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