gpt4 book ai didi

c# - 当 SelectedItem 是 ContentControl 时,为什么此 ComboBox 会忽略 DataTemplate?

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:21 25 4
gpt4 key购买 nike

在我们的应用程序中,我们有一个屏幕设计功能,它由一个自定义 ScreenDesignPanel 和一个属性网格组成,顶部有一个 ComboBox,它指向 ScreenDesignPanel 上的选定项目。这允许用户通过 ComboBox 或通过鼠标选择 UIElement 以设置其属性。我们通过将 ComboBox 的 ItemsSource 绑定(bind)到 ScreenDesignPanel 的 Children 集合,然后将它们的 SelectedItems 绑定(bind)在一起来实现这一点。这很好用。

但是,无论出于何种原因,如果 SelectedItemContentControlButton 之类的子类,则 ItemTemplateComboBox 指定的选项在“所选项目区域”中会被忽略,但在下拉列表中显示项目时会应用。如果 SelectedItem 不是 ContentControl,则在这两种情况下都使用该模板。

这似乎也特定于 ComboBox。如果我们使用任何其他选择器控件:ListBoxListViewItemsControl...甚至第三方ComboBox 控件...它们都按预期工作,正确应用了 DataTemplate。 ComboBox 正在内部做一些其他控件没有做的事情。

注意:以下是一个过度简化的示例,仅用于说明问题。这不是我们如上所述实际使用它的方式。

另请注意:在 ComboBox.ItemTemplate 的 DataTemplate 中,我们仅使用属性(即示例中的 Foreground),而不显示 DataContext(即实际的 ContentControl)本身。 这很重要,因为实际控件已经存在于 ScreenDesignPanel 上,因此不能用于在 ComboBox 的 ItemTemplate 中显示,因为它有两个父级,这不是不允许。换句话说,它在这里纯粹用作数据。

最后一件事...我们的应用程序中有一个可行的解决方案,即在将子项绑定(bind)到 ComboBox.ItemsSource 之前包装子项。但是,我仍然很好奇为什么 ComboBox 的行为方式是SPECIFICALLY 我要问的。 (换句话说,我不是在寻找此设计的其他解决方案。我们已经有了一个可行的解决方案。我正在寻找关于 ComboBox 本身的奇怪行为的清晰度。)

开始写代码了!

在下面的第一个示例中,请注意数据模板是如何应用于下拉列表中的所有内容的,但如果所选项目不是 ContentControl,则所选项目区域仅使用模板。

<ComboBox>

<ComboBox.ItemTemplate>

<DataTemplate>
<TextBlock Text="I am the template" Foreground="{Binding Foreground}" />
</DataTemplate>

</ComboBox.ItemTemplate>

<!-- Four 'Data' items for example only -->
<TextBlock Text="I am a Red TextBox" Foreground="Red"/>

<ListBox Foreground="Purple">
<ListBoxItem>I am a Purple ListBox</ListBoxItem>
</ListBox>

<ContentControl Content="I am a Blue ContentControl" Foreground="Blue" />

<Button Content="I am a Button with Green text" Foreground="Green" />

</ComboBox>

第二个示例表明,使用 UIElement 作为 ContentPresenter 的内容并仍然使用 DataTemplate 是完全可以接受和完全支持的>(通过 ContentTemplate),这样您就可以将它用作纯数据角色,允许模板本身定义视觉外观,而不显示 UIElement 本身,UIElement 本身在这里用作纯数据。

<ContentPresenter>

<ContentPresenter.ContentTemplate>

<DataTemplate>
<TextBlock Text="I am the ContentTemplate" Foreground="{Binding Foreground}" />
</DataTemplate>

</ContentPresenter.ContentTemplate>

<ContentPresenter.Content>
<Button Content="I am the button" Foreground="Green" />
</ContentPresenter.Content>

</ContentPresenter>

同样,这个问题特定于ComboBox。我想找出为什么数据模板没有应用于那个单一的案例,以及如何强制它如果可能,将被应用。

值得注意的是,ComboBox 确实定义了 SelectionBoxItemTemplate,它与常规的 ItemTemplate 是分开的,但问题是它是只读的,因此您可以设置它。我们真的不想重新模板化 ComboBox,因为这会弄乱正确的主题。

最佳答案

您是否尝试过将 DataTemplate 显式设置为 ContentControl.ContentTemplate 属性?:

<UserControl.Resources>
<DataTemplate x:Key="DataTemplate">
<TextBlock Text="{Binding Content,
StringFormat='Displayed via template: {0}'}" />
</DataTemplate>
</UserControl.Resources>
...
<ContentControl Content="ContentControl"
ContentTemplate="{StaticResource DataTemplate}" />

关于c# - 当 SelectedItem 是 ContentControl 时,为什么此 ComboBox 会忽略 DataTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19711096/

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