none
WPF MulitColumnComboBox RRS feed

  • 问题

  • 程序的内容:
    下拉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>
    2011年3月7日 5:36

答案

  • 现在能做的效果就是在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 论坛好帮手 立刻免费下载  MSDN 论坛好帮手

    • 已标记为答案 高俊鵬 2011年3月7日 12:41
    2011年3月7日 12:32
    版主

全部回复

  • 你有没有尝试过设置ComboBox的“DisplayMemberPath” 属性,比如:

    DisplayMemberPath="Name"

     


    Sheldon _Xiao[MSFT]

    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手

    2011年3月7日 6:46
    版主
  • to sheldon _Xiao

    首先谢谢你的答复。

    DisplayMemberPath 和 ComboBox.ItemTemplate是一样的,我使用了ComboBox.ItemTemplate就不能使用DisplayMemberPath 了。因为我下拉的时候想显示连列,而选择的关键字想用Id,选择后,闭合的时候想显示Id对应的Name。

    2011年3月7日 7:10
  • 我明白你的需求了,你要在一个输入框里面输入ID,然后当输入完成你希望显示的是Name?

    如果是这样,直接完成的解决方案我觉得没有,去完成你的需求,你尝试下面的方向:

    1) 你可以定义两个输入框,一个负责检索,一个负责显示,这样是可以完成的。而且实现起来不会很困难。如果你项目里面多处用到了这个控件,你可以自定义一个UserControl。

    2)你要重写输入的TextBox,然后定义一个合适的输入完成时间,或者检索完成事件,当触发这个事件的时候,你重新设置你的ComboBox的Text属性。这样也可以完成的你需求。

     

    Best regards,


    Sheldon _Xiao[MSFT]

    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手

    2011年3月7日 7:54
    版主
  • o sheldon _Xiao

    谢谢你再次的答复。

    你给指出的两个步骤我已经完成了第一个步骤,是在DataGrid的一个Cell里来添加这个MultiColumnComboBox的。利用CellTemplate和SelectedItemBinding来完成的。

    但是第二个步骤需要触发什么事件,有没有例子,谢谢。我自己也找找。

    2011年3月7日 8:17
  • 你这个ComboBox如果是在DataGrid里面的话,你可以参考DataGrid的CellTemplate和CellEditingTemplate,一个是编辑状态下的模板,一个是没有编辑状态下的模板,然后你编辑的时候显示ComboBox,然后用ID进行检索,当编辑完成,用TextBlock对选中项的Name进行显示,这样设计比较合理我觉得。而且也不用事件进行手动编写代码,用绑定就可以实现了。


    Sheldon _Xiao[MSFT]

    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    MSDN 论坛好帮手 立刻免费下载  MSDN 论坛好帮手

    2011年3月7日 9:29
    版主
  • 是的,我写错了,是用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>
    
    2011年3月7日 9:46
  • 现在能做的效果就是在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 论坛好帮手 立刻免费下载  MSDN 论坛好帮手

    • 已标记为答案 高俊鵬 2011年3月7日 12:41
    2011年3月7日 12:32
    版主