在WPF中的ListView中填充ComboBox

时间:2011-02-23 10:48:29

标签: wpf listview combobox wpf-controls

我在ComboBox内填充了ListView。屏幕截图如下 enter image description here

如上所示,它显示“M”,“a”,“c”而不是“Mac”。为什么将单词分成字符?

在我编写的代码隐藏文件中

ItemCategoryDAL itemCategoryDalObj = new ItemCategoryDAL();
            DataTable dataTable = itemCategoryDalObj.GetAllItemCategory();

            listView1.ItemsSource = dataTable.DefaultView;

在.xaml文件中我写道:

<ListView  Height="148" HorizontalAlignment="Left" Margin="23,12,0,0" Name="listView1" VerticalAlignment="Top" Width="447" >
  <ListView.View>
     <GridView>
        - - - - - - - - 
        - - - - - - - -
        <GridViewColumn Header="Category Name" Width="150">
           <GridViewColumn.CellTemplate>
               <DataTemplate>
                  <ComboBox ItemsSource="{Binding Path=IC_NAME }" Width="120" />
               </DataTemplate>
           </GridViewColumn.CellTemplate>
        </GridViewColumn> 
        - - - - - - - - -
        - - - - - - - - -
     </GridView>
  </ListView.View>
</ListView>

我正在使用Visual Studio 2010

dataTable的屏幕截图,我用作ListView的ItemSource。(在debuging期间拍摄) enter image description here

2 个答案:

答案 0 :(得分:4)

ComboBox允许用户从多个项目中进行选择。它通过遍历其ItemsSource中的所有项目并将每个项目添加到其Items来填充自己。

您正在将ItemsSource设置为返回字符串的属性。由于字符串可以迭代,ComboBox填充自己在迭代时得到的项目,因此字符串“Mac”变成项“M”,“a”和“c”。

这就是为什么你看到你所看到的。问题实际上是:你期望看到什么(或者你想看到什么)以及为什么? ComboBox显示哪些项目?如果您希望它显示DataTable中显示的所有类别名称,您可以执行以下操作:

ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=ItemsSource}"

然后使用IC_Name

从每个项目中提取DataTemplate
<ComboBox.ItemTemplate>
   <DataTemplate>
      <TextBlock Text="{Binding IC_Name}"/>
   </DataTemplate>
</ComboBox.ItemTemplate>

请注意,这样做会遇到各种意外现象。例如,如果表中只有一行将“Foo”作为值IC_Name,那么当用户为该行选择其他值并且表更新时,值“Foo”将从所有值中消失ComboBox es,使用户无法撤消该更改。此外,如果五行包含“Foo”,则每个ComboBox将在其下拉列表中显示“Foo”的所有五个实例。

答案 1 :(得分:0)

绑定似乎有效,IC_NAME存在并将“Mac”作为字符串返回。这将隐含地转换为具有三个条目的可枚举字符串:“M”,“a”和“c”。这就是你的ComboBox的ItemsSource。

<ComboBox ItemsSource="{Binding Path=IC_NAME }" Width="120" />

可能应该是这样的:

<ComboBox 
  SelectedItem="{Binding Path=IC_NAME}"
  ItemsSource="{Binding Path=NameOfACollectionProperty }" 
  Width="120" />