【发布时间】:2014-06-19 06:26:26
【问题描述】:
我在 WPF 中使用ComboBox,但有一种行为我不明白:这是default style/template of ComboBox 的链接。当IsEditable 为True 时,TextBox 显示并且用户可以键入文本进行搜索。我不太明白,所以我在检查代码:
<ContentPresenter x:Name="ContentSite"
IsHitTestVisible="False"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
Margin="3,3,23,3"
VerticalAlignment="Stretch"
HorizontalAlignment="Left">
</ContentPresenter>
<TextBox x:Name="PART_EditableTextBox"
Style="{x:Null}"
Template="{StaticResource ComboBoxTextBox}"
HorizontalAlignment="Left"
VerticalAlignment="Bottom"
Margin="3,3,23,3"
Focusable="True"
Background="Transparent"
Visibility="Hidden"
IsReadOnly="{TemplateBinding IsReadOnly}" />
似乎有两个视觉组件重叠,IsEditable 通过设置Visibility 在它们之间切换。 This link 验证:“当 IsEditable 等于 false 时,ComboBox 使用 ContentPresenter 来显示当前选定的项目;当 IsEditable 等于 true 时,使用 TextBox 代替。请注意,仅 TextBox显示纯文本,并且 ComboBoxItem 可能包含非纯文本内容,例如图像。“我的问题是,在 TextBox 中,它在哪里定义文本? Template (ComboBoxTextBox) 不分配文本。我问是因为我试图让TextBox 显示与ContentPresenter 相同的信息(如果可能的话)(即,当IsEditable 为假时),我理解其模板绑定到@ 987654335@我分配。
【问题讨论】:
-
您是否要为组合框设置下拉菜单?还是想通过模板在可编辑和只读之间切换?
-
@pushpraj 我试图让
TextBox(仅在IsEditable为True 时可见,否则ContentPreseter如我的第二个链接所示可见)具有相同的ItemTemplate我设置。因为默认情况下,如果IsEditable为真,则TextBox显示,ItemTemplate不适用于它。它使用所选项目的ToString函数,或者如果我在ComboBox上设置TextSearch.TextPath,则显示项目的属性(ToString)值。它们都不是我想要的,因为我希望可编辑的TextBox确实显示更多信息,就像我在ItemTemplate中定义的那样 -
@pushpraj 所以我试图了解默认模板是如何工作的,希望我能在理解时更改它。但到目前为止,我没有看到
TextBox文本的任何设置。 -
@tete 首先“文本框显示,用户可以输入文本进行搜索。”是不正确的。它只是让用户可以输入文本。您可以将
Text="{TemplateBinding ComboBox.Text}"添加到<TextBox x:Name="PART_EditableTextBox"/>,它们具有相同的结果。所以我猜有一些默认设置。是的,只是猜测..