c# - WPF Datagrid 绑定(bind)列表问题

标签 c# wpf visual-studio-2008 list datagrid

我有一个自定义对象列表:比如带有两个字符串属性名称和颜色的水果。这些在列表中。

private readonly List<Fruit> fruitList = new List<Fruit>();

然后我将水果对象加载到列表中。

我正在尝试将此列表绑定(bind)到 WPF Datagrid:

C#:

dgFruit.ItemsSource = "{Binding}";

XAML:

<toolkit:DataGrid Name="dgFruit" 
            ItemsSource="{Binding Path=fruitList}" >
                <toolkit:DataGrid.Columns>

                    <toolkit:DataGridComboBoxColumn 
            Header="Name" 
            SelectedValueBinding="{Binding Path=Name}" 
            TextBinding="{Binding Path=Name}" Width="5*" />   

                    <toolkit:DataGridComboBoxColumn 
            Header="Color"
            SelectedValueBinding="{Binding Path=Color}"
            TextBinding="{Binding Path=Color}" Width="5*" />

                </toolkit:DataGrid.Columns>
            </toolkit:DataGrid>

他们在组合框中的原因是因为我希望用户能够更改关系。这不是真实的例子,但你明白了。举个例子,水果还没有成熟,所以他们把香蕉的颜色变成了绿色:)

我没有任何运气在数据网格中获得这些项目......然后沿着轨道,我想点击数据网格单元格中的项目以更改为组合框并显示所有可能类型的水果名称和颜色(所以他们可以改变关系)

这是我遇到的错误:

System.Windows.Data Error: 39 : BindingExpression path error: 'Color' property not found on 'object' ''Char' (HashCode=6750311)'. BindingExpression:Path=Color; DataItem='Char' (HashCode=6750311); target element is 'TextBlockComboBox' (Name=''); target property is 'Text' (type 'String')

有人可以帮忙吗?我在 xaml 中设置列​​的原因是我可以将宽度设置为星形大小并使列宽度相等。

我看到大多数示例都使用 ObservableCollection,但如果我可以绑定(bind)到列表,为什么我必须使用它?

如果我的示例需要进一步说明,请告诉我

编辑:我现在拥有的:

XAML:

            <toolkit:DataGrid Name="dgFruit" 
            ItemsSource="{Binding}"
            AutoGenerateColumns="False">

                <toolkit:DataGrid.Columns>
                    <toolkit:DataGridTextColumn 
                        Header="Name"
                        Width="5*"/>

                    <toolkit:DataGridComboBoxColumn 
            Header="Color"
            Width="5*"/>

                    </toolkit:DataGrid.Columns>
</toolkit:DataGrid>

C#:

DataContext = fruitList;

实际上,当我使用 DataContext 时,我没有得到任何项目。当我使用 ItemSource 时,我得到空行,但行数正确,所以这看起来更符合正确的行。

如果我让它自动生成列,我可以获得要显示的数据。如果我将 autogeneratecolumns 设置为 false,然后在 xaml 中指定我的列,就像我想使用星号大小一样,我会得到正确的列数,但没有文本!

最佳答案

首先,这个:

dgFruit.ItemsSource = "{Binding}"

应该将项目源设置为一个字符串,该字符串在大括号中包含单词 Binding。这几乎肯定不是您想要的(事实上,如果您这样做,您最终应该得到一个包含九行的网格,每行对应字符串中的每个字符!)。您可以在 XAML 或后面的代码中设置 ItemsSource,但您不应该同时执行这两项操作。尝试以下操作:

<toolkit:DataGrid Name="dgFruit"       
                  ItemsSource="{Binding}">
    ...
</toolkit:DataGrid>

然后在您的视觉构造函数中:

...
    InitializeComponents();
    this.DataContext = fruitList;
...

现在整个视觉对象的数据上下文是 List,并且网格的 ItemsSource 设置为同一对象。我在这里假设 fruitList 是视觉本身的一个字段。

您的列的绑定(bind)应该类似于:

        <toolkit:DataGridTextColumn Header="Name"
                                    Binding="{Binding Name}"
                                    Width="5*" />
        <toolkit:DataGridComboBoxColumn Header="Color"
                                        ItemsSource="{Binding Source={StaticResource AllColors}}"
                                        SelectedValueBinding="{Binding Path=Color}"
                                        TextBinding="{Binding Path=Color}"
                                        Width="5*" />

AllColors 被定义为资源(​​在本例中):

<x:Array x:Key="AllColors"
         Type="sys:String">
    <sys:String>Orange</sys:String>
    <sys:String>Yellow</sys:String>
</x:Array>

这应该可以帮助您入门。

关于c# - WPF Datagrid 绑定(bind)列表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129636/

相关文章:

c# - Gridview 获取 Checkbox.Checked 值

c# - C#三元运算符

c# - 在 LINQ 中以分钟精度确定 Datetime 值的相等性

c# - 如何避免在递归算法中达到线程池的最大值?

wpf - 如何将特定控件的 ZIndex 设置到最顶层

visual-studio-2008 - ASP.NET 3.5 版网站 : what does the file "vwd.webinfo" do, 究竟是什么?臃肿的 web.config 文件是怎么回事?

c# - HRESULT 异常 : 0x80070057 (E_INVALIDARG)

c# - 类定义上的 "Inconsistent accessibility"

c++ - VC++ 中的 getopt()

.net - 在VS中使用64位操作系统进行.Net开发