我在ComboBox
内填充了ListView
。屏幕截图如下
如上所示,它显示“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期间拍摄)
答案 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" />