积极答复者
WPF MulitColumnComboBox

问题
-
程序的内容:
下拉ComboBox时,显示两列数据,一列为Name,一列为Id。
关闭ComboBox时,显示一列Name数据。
而检索的关键字为Id。
问题:
现在只要把检索关键字设为Id,即TextSearch.TextPath="Id",关闭ComboBox时,显示的就是Id,而非Name。<ComboBox x:Name="multicolumnComboBox"
TextSearch.TextPath="Id"
IsEditable="True"
IsReadOnly="False">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" Width="150" />
<TextBlock Text="{Binding Id}" Width="100" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
答案
-
现在能做的效果就是在ComboBox上进行按照Id检索,然后在TextBlock上进行显示。
如果你要使用“TextSearch.TextPath="Id"”方法进行搜索ComboBox DropDownList中的内容的话,在ComboBox上显示也会是Id属性的Value。
如果你要想完成类似的功能,但是在ComboBox上显示的是Name属性,我建议你自己完成ComboBox的检索功能,参考链接:
http://www.codeproject.com/KB/WPF/WPFAutoCompleteTextbox.aspx
Sheldon _Xiao[MSFT]
如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
立刻免费下载 MSDN 论坛好帮手
- 已标记为答案 高俊鵬 2011年3月7日 12:41
全部回复
-
你有没有尝试过设置ComboBox的“DisplayMemberPath” 属性,比如:
DisplayMemberPath="Name"
Sheldon _Xiao[MSFT]
如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
立刻免费下载 MSDN 论坛好帮手
- 已编辑 Sheldon _XiaoModerator 2011年3月16日 7:46
-
我明白你的需求了,你要在一个输入框里面输入ID,然后当输入完成你希望显示的是Name?
如果是这样,直接完成的解决方案我觉得没有,去完成你的需求,你尝试下面的方向:
1) 你可以定义两个输入框,一个负责检索,一个负责显示,这样是可以完成的。而且实现起来不会很困难。如果你项目里面多处用到了这个控件,你可以自定义一个UserControl。
2)你要重写输入的TextBox,然后定义一个合适的输入完成时间,或者检索完成事件,当触发这个事件的时候,你重新设置你的ComboBox的Text属性。这样也可以完成的你需求。
Best regards,
Sheldon _Xiao[MSFT]
如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
立刻免费下载 MSDN 论坛好帮手
- 已编辑 Sheldon _XiaoModerator 2011年3月16日 7:46
-
你这个ComboBox如果是在DataGrid里面的话,你可以参考DataGrid的CellTemplate和CellEditingTemplate,一个是编辑状态下的模板,一个是没有编辑状态下的模板,然后你编辑的时候显示ComboBox,然后用ID进行检索,当编辑完成,用TextBlock对选中项的Name进行显示,这样设计比较合理我觉得。而且也不用事件进行手动编写代码,用绑定就可以实现了。
Sheldon _Xiao[MSFT]
如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
立刻免费下载 MSDN 论坛好帮手
- 已编辑 Sheldon _XiaoModerator 2011年3月16日 7:46
-
是的,我写错了,是用DataGrid的CellTemplate和CellEditingTemplate来实现的,但是有些问题还是不能解决。比如,把检索关键字设为Id,即TextSearch.TextPath="Id",关闭ComboBox时,显示的就是Id,而非Name。焦点从这条记录移开,才会显示Name。
代码:
<DataTemplate x:Key="CellTemplate"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding ComboBoxData.Name, Mode=TwoWay}" Width="100"/> </StackPanel> </DataTemplate> <DataTemplate x:Key="CellEditingTemplate"> <ComboBox Height="22" IsEditable="True" IsReadOnly="False" TextSearch.TextPath="Id" ItemsSource="{StaticResource StatusList}" SelectedItem="{Binding ComboBoxData}"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}" Width="150"/> <TextBlock Text="{Binding Id}" Width="100"/> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </DataTemplate>
<my:DataGrid Grid.Row="0" x:Name="dgData" AutoGenerateColumns="False"> <my:DataGrid.Columns> <my:DataGridTemplateColumn Header="DataGridTemplateColumn" Width="170" CellTemplate="{StaticResource CellTemplate}" CellEditingTemplate="{StaticResource CellEditingTemplate}"/> </my:DataGrid.Columns> </my:DataGrid>
-
现在能做的效果就是在ComboBox上进行按照Id检索,然后在TextBlock上进行显示。
如果你要使用“TextSearch.TextPath="Id"”方法进行搜索ComboBox DropDownList中的内容的话,在ComboBox上显示也会是Id属性的Value。
如果你要想完成类似的功能,但是在ComboBox上显示的是Name属性,我建议你自己完成ComboBox的检索功能,参考链接:
http://www.codeproject.com/KB/WPF/WPFAutoCompleteTextbox.aspx
Sheldon _Xiao[MSFT]
如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
立刻免费下载 MSDN 论坛好帮手
- 已标记为答案 高俊鵬 2011年3月7日 12:41