【问题标题】: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 属性?在我看来,您可能有项目,这些项目只是显示为空白。
  • 你会如何设置这个?

标签: c# wpf mvvm combobox


【解决方案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()会怎样
  • 刚刚添加到问题中。我正在这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多