【问题标题】:Populating ComboBox inside ListView in WPF在 WPF 中的 ListView 内填充 ComboBox
【发布时间】:2011-07-02 16:03:27
【问题描述】:

我在ListView 中填充了ComboBox。屏幕截图如下

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

在我编写的文件后面的代码中

ItemCategoryDAL itemCategoryDalObj = new ItemCategoryDAL(); 数据表 dataTable = itemCategoryDalObj.GetAllItemCategory(); listView1.ItemsSource = dataTable.DefaultView;

在我写的 .xaml 文件中:

- - - - - - - - - - - - - - - - 数据模板> - - - - - - - - - - - - - - - - - - 列表视图>

我正在使用 Visual Studio 2010

dataTable 的屏幕截图,我将其用作 ListView 的ItemSource。(在调试期间拍摄)

【问题讨论】:

    标签: wpf listview combobox wpf-controls


    【解决方案1】:

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

    您将ItemsSource 设置为返回字符串的属性。由于一个字符串可以被迭代,ComboBox 会用它在迭代它时得到的项目来填充自己,所以字符串“Mac”变成了项目“M”、“a”和“c”。

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

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

    然后使用DataTemplate从每个项目中拉出IC_Name列:

    <ComboBox.ItemTemplate>
       <DataTemplate>
          <TextBlock Text="{Binding IC_Name}"/>
       </DataTemplate>
    </ComboBox.ItemTemplate>
    

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

    【讨论】:

      【解决方案2】:

      绑定似乎有效,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" />
      

      【讨论】:

      • IC_NAMEDataTable 列名。
      • @David Webb:IC_NAME 可能返回一个字符串。这就是为什么你会看到这个结果。我假设这是您要在下拉列表中选择的值,而不是 ItemsSource。使用 ItemsSource,您可以指定构建项目的集合。
      • 其实NameOfACollectionProperty是什么意思? (可能是我不知道,因为我缺乏知识。)
      • 必须定义组合框的项目。您可以通过在标记中添加 ComboBoxItem-elements 或通过指定 ItemsSource 来做到这一点。我假设 IC_NAME 列包含应该选择的值。这是通过 SelectedItem 或 SelectedValue 属性声明的。但是,如果是这种情况,您还必须指定哪些项目应包含在 ComboBox 中。但是我没有足够的关于您的应用程序的信息来说明哪些是项目。在这里查看更多信息。至 ItemsSource:msdn.microsoft.com/en-us/library/…
      • 我将dataTable 用作ListView 的ItemSorce。并使用此 DataTable 的 IC_NAME 列填充组合框。在编辑版本中,我添加了dataTable 的图像
      猜你喜欢
      • 1970-01-01
      • 2016-03-18
      • 2014-12-06
      • 1970-01-01
      • 2018-08-03
      • 2011-04-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多