【问题标题】:How to display a List of Strings as a DataGrid (table) in XAML and C#如何在 XAML 和 C# 中将字符串列表显示为 DataGrid(表)
【发布时间】:2015-05-13 12:27:38
【问题描述】:

我在 SO 上潜伏了很长时间,直到最近才决定建立一个帐户。我已经花了很多时间试图解决这个我一直没有问的问题,但我在这里。

我想要完成的事情:

我有一个字符串列表,例如:Mango、Banana、Melon(我们称之为水果),我想将其显示为 XAML (WPF) 中的表格,它在左侧显示为行值,并且右侧将是组合框,允许用户选择一个值。我目前被困在这个问题的显示部分。我决定使用 DataGrid 来显示列表,后面的代码会做数据绑定。

这是其中的 XAML 部分:

<DataGrid x:Name="FruitDataGrid" Height="265" VerticalAlignment="Center" Margin="-7,8,-2,-6" HorizontalAlignment="Left" Width="1188" AutoGenerateColumns="False"> 
 <!-- If AutoGenerateColumns was true only the length is displayed.-->
         <DataGrid.Columns>
         <DataGridTextColumn x:Name="fruitsDisplay" Header="Fruits" MinWidth="450" IsReadOnly="True" />
         <DataGridComboBoxColumn Header="Number of Boxes" MinWidth ="200" CanUserResize="True" Width="*"></DataGridComboBoxColumn>
  </DataGrid.Columns>

到目前为止,Code Behind 非常简单,经过多次尝试,这是最近的一次。

private void populateFruitList()
    {
        FruitDataGrid.DataContext = fruitDataTable;
        //Binds a datatable instance to the datagrid, does not display anything.
    }

我一直在尝试的:

将字符串列表转换为 Observable 集合或 Enumerable,然后执行 FruitDataGrid.itemsource = fruitsObservable;

上述方法有效,只是它只会显示每个字符串值的长度(如果 autogeneratecolumns 为真),这不是我想要的。如果 autogeneratecolumns 为假,那么我可以看到显示的行,但看不到字符串值。

我也尝试使用 DataView 或 DataGridView 但我未能在 XAML 中定义它,VS2012 说没有这样的东西。

我一直在尝试像MSDN Article 所说的那样进行数据绑定,但是 VS2012 从未设法正确绑定到列表。

然后我尝试将我的列表更改为数据表并[使用此处指定的数据网格视图,但 XAML 再次告诉我它不是有效的类][2]。我也知道 datagridview 可能会对性能产生影响,但此时我只想真正显示一个表格。

我还看到一些教程使用 DataGrid.datasource 方法,但这不在我想要的 DataGrid 中,我认为它是一个不同的类? (我尝试使用的 DataGrid 是 System.Windows.Controls.DataGrid,另一个在 Windows 窗体中 [如图所示][3])

再次感谢您抽出宝贵时间对此进行调查。

编辑

尝试以这种方式绑定到 XAML 中的列表:

<DataGrid x:Name="FruitDataGrid" Height="265" VerticalAlignment="Center" Margin="-7,8,-2,-6" HorizontalAlignment="Left" Width="1188" AutoGenerateColumns="False" ItemsSource="fruitDataList"> 

我在 XAML 中收到错误“IEnumerable 的类型转换器不支持从字符串转换”,我认为这是因为我做错了。不过,该表现在显示了很多空行。

尝试 ItemSource="{Binding fruitDataList}"(其中fruitDataList 是一个列表)会产生一个空白表,并在 VS 中出现错误 for BindingExpression 路径错误。

【问题讨论】:

标签: c# wpf xaml datagrid datatable


【解决方案1】:

总结上一个问题是什么,感谢 Muds 和数小时的尝试,XAML 中的绑定没有正确完成。

在 FruitDataGrid 中,此属性应写为 ItemSource="{Binding}" 这告诉 XAML 代码绑定到在后面的代码中分配 DataContext 的任何对象。

之后,在 DataGrid.Column 中,需要此属性。

Binding="{Binding Path=.}"

对我来说一定是这样。缺少点或不将其括在引号中将不会显示结果。

因此,为了清楚起见:

在 XAML 中:

<DataGrid x:Name="FruitDataGrid" 
 Height="265" VerticalAlignment="Center" Margin="-7,8,-2,-6" 
 HorizontalAlignment="Left" Width="1188" 
 AutoGenerateColumns="False"
 ItemSource="{Binding}"> 
<!-- If AutoGenerateColumns was true only the length is displayed.-->
<DataGrid.Columns>
<DataGridTextColumn 
      x:Name="fruitsDisplay" 
      Header="Fruits" MinWidth="450" 
      IsReadOnly="True" 
      Binding="{Binding Path=.}"/>    <!--Exactly like this -->
<DataGridComboBoxColumn 
       Header="Number of Boxes" 
       MinWidth ="200" 
       CanUserResize="True" Width="*" />
 </DataGrid.Columns>

然后在代码隐藏(filename.xaml.xs)中

//Anywhere you plan to bind the list in my case FruitList
List<string> fruitList = new List<string>();
fruitList.add("Melon");
fruitList.add("Mango");
fruitList.add("Banana");

FruitDataGrid.DataContext = fruitList;

现在您将有一个非常漂亮的列表显示为表格。杀死我 2 天时间的是绑定路径应该有一个 . (点)就在那里,我正在绑定到一个字符串而不是一个对象(当您执行 Binding = {“fruitList”} 时,您实际上是绑定到一个字符串“fruitList”。这个业余错误源于我对 XAML 的自学不足。

再次感谢,Muds。我会选择你的作为答案,因为它对我有帮助,接受我自己的答案感觉很奇怪。

【讨论】:

  • 我也在这个上浪费了几个小时。非常感谢。
【解决方案2】:

考虑到您的绑定已正确设置为您的视图模型.. 这样做

ItemsSource="{Binding fruitDataList}"

然后

<DataGrid.Columns>
         <DataGridTextColumn 
x:Name="fruitsDisplay"
Binding="{Binding Path=FRUITS_PROPERTY_NAME_IN_COLLECTION}"
Header="Fruits"
MinWidth="450" 
IsReadOnly="True" />

         <DataGridComboBoxColumn
ItemsSource="{Binding TO_List_of_Numbers}" 
Header="Number of Boxes"
MinWidth ="200" 
CanUserResize="True" Width="*"></DataGridComboBoxColumn>

【讨论】:

  • 感谢您的回复,我一直在尝试您在此处和此处所说的内容,无论有无绑定“路径”值,它仍然显示为没有值的行(autogenerateColumns=false),并且我的错误仍然是'System.Windows.Data Error: 40: BindingExpression path error: 'fruitDataList' property not found on 'object' ''String'。绑定表达式:路径=水果数据列表; DataItem='String' 目标元素是 'TextBlock' (Name='');目标属性是文本'我不确定您所说的 FRUITS_PROPERTY_NAME_IN_COLLECTION 是什么意思?我也尝试了一个可枚举的列表。再次感谢
  • 向我们展示您的视图模型代码以及什么是fruitDataList集合
  • 我并没有真正做 MVVM,它只是 XAML 和背后的代码。 fruitDataList 只是一个 List 目前它是 {Mango, Banana, Melon} 我终于在你的帮助下解决了它,我所要做的就是代替 FRUITS_PROPERTY_NAME_IN_COLLECTION,我做了: Binding="{Binding Path=.}那里的点正好映射它。Itemsource 也是:ItemsSource="{Binding}" 然后我所要做的就是 FruitDataGrid.DataContext = fruitDataList。谢谢@Muds!
  • 哦,顺便说一下,您提供的示例中 DataGridComboBoxColumn 的 ItemsSource 也应该有引号。以防万一另一个 xaml 初学者(比如我)过来拿走你的代码。
  • 已修复 :) ...这就是您在文本框中编写代码时发生的情况:P
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多