如何在 XAML 和 C# 中将字符串列表显示为 DataGrid (table)
How to display a List of Strings as a DataGrid (table) in XAML and C#
我在 SO 上潜伏了很长时间,直到最近才决定建立一个帐户。我花了很多时间试图解决这个我一直没有问过的问题,但我在这里。
我想要完成的事情:
我有一个字符串列表,例如:Mango、Banana、Melon(我们称之为水果),我想在 XAML (WPF) 中将其显示为 table,其中在左侧显示为行值,右侧将是允许用户选择值的组合框。我目前停留在这个问题的显示部分。我决定使用 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.
}
我一直在尝试的:
将字符串列表转换为可观察集合或可枚举对象,然后执行 FruitDataGrid.itemsource = fruitsObservable;
上述方法有效,只是它只会显示每个字符串值的长度(如果 autogeneratecolumns 为 true),这不是我想要的。如果 autogeneratecolumns 为 false,那么我可以看到显示的行,但看不到字符串值。
我也试过使用DataView或DataGridView,但我在XAML中定义失败,VS2012说没有这样的东西。
我一直在尝试像 MSDN Article 所说的那样进行数据绑定,但 VS2012 从未设法正确绑定到列表。
然后我尝试将列表更改为数据table并[使用此处指定的数据网格视图,但XAML再次告诉我它不是有效的class][ 2].我也知道 datagridview 可能会对性能产生影响,但此时我只想真正显示 table。
我还看到一些教程使用了 DataGrid.datasource 方法,但它不在我想要的 DataGrid 中,我认为它是不同的 class? (我尝试使用的 DataGrid 是 System.Windows.Controls.DataGrid,另一个是 Windows Forms [如图所示][3])
再次感谢您抽出宝贵时间对此进行调查。
编辑
尝试以这种方式绑定到 XAML 中的列表:
<DataGrid x:Name="FruitDataGrid" Height="265" VerticalAlignment="Center" Margin="-7,8,-2,-6" HorizontalAlignment="Left" Width="1188" AutoGenerateColumns="False" ItemsSource="fruitDataList">
我在 XAML "The type converter for IEnumerable does not support converting from a string" 中收到错误,我认为这是因为我做错了。 table 现在显示了很多空行。
尝试 ItemSource="{Binding fruitDataList}"(其中 fruitDataList 是一个列表)产生空白 table,并且 VS 中出现 BindingExpression 路径错误错误。
考虑到您的绑定已正确设置为您的 viewmodel.. 执行此操作
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>
总结一下上一个问题是什么,多亏了 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;
现在您将有一个非常漂亮的列表显示为 table。杀死我 2 天时间的是绑定路径应该有一个 . (点)就在那里,我绑定到一个字符串而不是一个对象(当你执行 Binding = {"fruitList"} 时,你实际上是绑定到一个字符串 "fruitList" 。这个业余错误源于我自己不够-学习XAML.
再次感谢,泥浆。我将 select 你的答案作为答案,因为它对我有帮助,而且接受我自己的答案感觉很奇怪。
我在 SO 上潜伏了很长时间,直到最近才决定建立一个帐户。我花了很多时间试图解决这个我一直没有问过的问题,但我在这里。
我想要完成的事情:
我有一个字符串列表,例如:Mango、Banana、Melon(我们称之为水果),我想在 XAML (WPF) 中将其显示为 table,其中在左侧显示为行值,右侧将是允许用户选择值的组合框。我目前停留在这个问题的显示部分。我决定使用 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.
}
我一直在尝试的:
将字符串列表转换为可观察集合或可枚举对象,然后执行 FruitDataGrid.itemsource = fruitsObservable;
上述方法有效,只是它只会显示每个字符串值的长度(如果 autogeneratecolumns 为 true),这不是我想要的。如果 autogeneratecolumns 为 false,那么我可以看到显示的行,但看不到字符串值。
我也试过使用DataView或DataGridView,但我在XAML中定义失败,VS2012说没有这样的东西。
我一直在尝试像 MSDN Article 所说的那样进行数据绑定,但 VS2012 从未设法正确绑定到列表。
然后我尝试将列表更改为数据table并[使用此处指定的数据网格视图,但XAML再次告诉我它不是有效的class][ 2].我也知道 datagridview 可能会对性能产生影响,但此时我只想真正显示 table。
我还看到一些教程使用了 DataGrid.datasource 方法,但它不在我想要的 DataGrid 中,我认为它是不同的 class? (我尝试使用的 DataGrid 是 System.Windows.Controls.DataGrid,另一个是 Windows Forms [如图所示][3])
再次感谢您抽出宝贵时间对此进行调查。
编辑
尝试以这种方式绑定到 XAML 中的列表:
<DataGrid x:Name="FruitDataGrid" Height="265" VerticalAlignment="Center" Margin="-7,8,-2,-6" HorizontalAlignment="Left" Width="1188" AutoGenerateColumns="False" ItemsSource="fruitDataList">
我在 XAML "The type converter for IEnumerable does not support converting from a string" 中收到错误,我认为这是因为我做错了。 table 现在显示了很多空行。
尝试 ItemSource="{Binding fruitDataList}"(其中 fruitDataList 是一个列表)产生空白 table,并且 VS 中出现 BindingExpression 路径错误错误。
考虑到您的绑定已正确设置为您的 viewmodel.. 执行此操作
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>
总结一下上一个问题是什么,多亏了 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;
现在您将有一个非常漂亮的列表显示为 table。杀死我 2 天时间的是绑定路径应该有一个 . (点)就在那里,我绑定到一个字符串而不是一个对象(当你执行 Binding = {"fruitList"} 时,你实际上是绑定到一个字符串 "fruitList" 。这个业余错误源于我自己不够-学习XAML.
再次感谢,泥浆。我将 select 你的答案作为答案,因为它对我有帮助,而且接受我自己的答案感觉很奇怪。