为啥这个组合框不显示项目?

Posted

技术标签:

【中文标题】为啥这个组合框不显示项目?【英文标题】:Why isn't this combobox displaying items?为什么这个组合框不显示项目? 【发布时间】:2018-04-17 16:54:34 【问题描述】:

我正在编写一个导入实用程序,我希望用户能够从 CSV 上传,然后将列定向到他们想要的位置。

因此,为了做到这一点,我将每列的标题设为一个 ComboBox,其中填充了所有可能的列。

xaml

        <DataGrid x:Name="ImportTable" 
                  ItemsSource="Binding displayTable"
                  AutoGeneratingColumn="OnAutoGeneratingColumn"
                  AutoGenerateColumns="True"
                  CanUserAddRows="True" 
                  CanUserDeleteRows="True"
                  EnableColumnVirtualization="True"
                  EnableRowVirtualization="True"
                  MaxWidth="1300"
                  MaxHeight="600"
                  />

xaml.cs

    private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    

        var cb = new ComboBox();
        foreach (DataColumn test in (DataContext as EnterValueDialogViewModel).displayTable.Columns)
            Console.Out.WriteLine(test);

        cb.ItemsSource = (DataContext as EnterValueDialogViewModel).displayTable.Columns;
        e.Column.Header = cb;
    

这会正确打印出所有列,但组合框内实际上没有显示任何内容

Empty Combobox


组合框现在可以正确显示在下拉列表中。但我无法设置它的 selectedValue。以下代码打印出 selectedvalue 是正确的,但它最初仍填充为空白/未选中

        var cb = new ComboBox();
        cb.DisplayMemberPath = "ColumnName";
        cb.SelectedValue = e.PropertyName.ToString();
        cb.ItemsSource = (DataContext as EnterValueDialogViewModel).displayTable.Columns;
        Console.Out.WriteLine(cb.SelectedValue);
        e.Column.Header = cb;

【问题讨论】:

您是否尝试过为您的组合框设置DisplayMemberPath 属性?在我看来,您可能有项目,这些项目只是显示为空白。 你会如何设置这个? 【参考方案1】:

您可以尝试设置组合框的DisplayMemberPath

    private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    

        var cb = new ComboBox();
        cb.DisplayMemberPath = "SomePropertyFromYourCollection";
        foreach (DataColumn test in (DataContext as EnterValueDialogViewModel).displayTable.Columns)
            Console.Out.WriteLine(test);

        cb.ItemsSource = (DataContext as EnterValueDialogViewModel).displayTable.Columns;
        e.Column.Header = cb;
    

文档here。

【讨论】:

这是正确的!谢谢我想将 selectedValue 设置为 e.PropertyName。但它似乎不起作用。【参考方案2】:

你需要设置我认为的组合框的DisplayMemberPathSelectedValuePath

这些将是您的数据文件中的列名。

它应该看起来像这样:

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)

    var cb = new ComboBox();
    foreach (DataColumn test in (DataContext as EnterValueDialogViewModel).displayTable.Columns)
        Console.Out.WriteLine(test);

    cb.ItemsSource = (DataContext as EnterValueDialogViewModel).displayTable.Columns;
    cb.DisplayMemberPath = "Column1";
    cb.SelectedValuePath = "Column2";
    e.Column.Header = cb;
   

如果有帮助,请告诉我。

【讨论】:

所以我已经让 DisplayMemberPath 指向“ColumnName”并且有效。我希望 selectedValue 基于 e.PropertyName。这应该是该列的默认标题。但这似乎不起作用 如果你说e.PropertyName.ToString()会怎样 刚刚添加到问题中。我正在这样做。

以上是关于为啥这个组合框不显示项目?的主要内容,如果未能解决你的问题,请参考以下文章

Extjs组合框不显示所选值

组合框不显示图像

为啥列表框不使用 Visual C++ 6 显示元素?

组合框和列表框不显示文本文件的内容

ExtJS/MODx CMP:网格编辑不保存到数据库,组合框不显示

德尔福。为啥要在 Windows 7 64 位上以发布模式编译程序。但是文本框不显示文本?