C# WPF Datagrid绑定到列表问题

C# WPF Datagrid绑定到列表问题,c#,wpf,visual-studio-2008,list,datagrid,C#,Wpf,Visual Studio 2008,List,Datagrid,我有一个自定义对象列表:比如带有两个字符串属性Name和Color的水果。这些都在列表中 private readonly List<Fruit> fruitList = new List<Fruit>(); XAML: 有人能帮忙吗?我在xaml中设置列的原因是,我可以将宽度设置为星形大小,并使列的宽度相等 我看到大多数示例都使用ObservableCollection,但如果我可以绑定到list,为什么要使用它 如果我的例子需要进一步澄清,请让我知道 编辑:我现在拥

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

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

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

我看到大多数示例都使用ObservableCollection,但如果我可以绑定到list,为什么要使用它

如果我的例子需要进一步澄清,请让我知道

编辑:我现在拥有的:

XAML:

实际上,当我使用DataContext时,我没有得到任何项。当我使用ItemSource时,我会得到空行,但行数是正确的,因此这似乎更符合正确的行数


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

WPF不支持绑定到字段。创建一个访问
水果列表的属性并绑定到该属性

    // this is the field. you can't bind to this
    private readonly List<Fruit> fruitList = new List<Fruit>();

    // this is the property. you can bind to this
    public List<Fruit> FruitList
    {
        get { return fruitList; }
    }
如果愿意,您可以使用
列表。
ObservableCollection
的优点是它已经为您实现了
INotifyCollectionChanged
INotifyPropertyChanged
,首先,这:

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

<toolkit:DataGrid Name="dgFruit"       
                  ItemsSource="{Binding}">
    ...
</toolkit:DataGrid>
现在,整个可视化的数据上下文是列表,网格的ItemsSource设置为同一个对象。我在这里假设水果列表本身就是一个视觉领域

列的绑定应类似于:

        <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*" />

其中AllColor定义为资源(在本例中):


橙色
黄色的

这应该可以让您开始了。

我不明白您创建一个访问水果列表的属性是什么意思。我想我可以使用ObservableCollection,就像我在其他地方使用列表一样。我不理解这需要一份清单。我希望该列表是Fruit.Color或Fruit.Name中的所有值。gridview shuold显示原始关系,即Apple->Red和Banana->Yellow是值,但如果双击Apple,我会看到包含所有水果对象选项的组合,因此Apple和Banana,以及类似的颜色…它是owrks,但当我这样做时,我在xaml中定义的列将被忽略,并在左侧添加新的列。我可以通过编程为这些自动生成的列设置星形大小吗?您可以关闭自动生成的列。在XAML中的数据网格上:AutoGenerateColumns=“False”谢谢!我不知道前几天我怎么没有试过——试了一千种变体,但都成功了。我想我可能需要阅读更多关于数据绑定的内容。
DataContext = fruitList;
    // this is the field. you can't bind to this
    private readonly List<Fruit> fruitList = new List<Fruit>();

    // this is the property. you can bind to this
    public List<Fruit> FruitList
    {
        get { return fruitList; }
    }
public class Fruit
{
    public string Name { get; set; }
    public string Color { get; set; } // bind the combobox selectedvalue to this

    public List<string> AvailableColors { get; set; } // bind the combobox ItemsSource to this
}
dgFruit.ItemsSource = "{Binding}"
<toolkit:DataGrid Name="dgFruit"       
                  ItemsSource="{Binding}">
    ...
</toolkit:DataGrid>
...
    InitializeComponents();
    this.DataContext = fruitList;
...
        <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*" />
<x:Array x:Key="AllColors"
         Type="sys:String">
    <sys:String>Orange</sys:String>
    <sys:String>Yellow</sys:String>
</x:Array>