WPF Datagrid绑定列出问题

时间:2010-01-25 01:04:38

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

我有一个自定义对象列表:说具有两个字符串属性Name和Color的Fruits。这些都在列表中。

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

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

我正在尝试将此列表绑定到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>

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

我没有运气在数据网格中获取这些项目...并且在轨道上,我想要点击datagridcell中的项目以更改为组合框并显示所有可能类型的水果名称和颜色(所以他们可以改变关系)

这是我遇到的错误:

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中设置colums的原因是我可以将宽度设置为星号并使列宽度相等。

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

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

编辑:我现在拥有的内容:

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中指定我的列,就像我想要使用星号大小一样,我得到正确数量的列但没有文本!

2 个答案:

答案 0 :(得分:4)

WPF不支持绑定到字段。创建一个访问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; }
    }

使用dgFruit.DataContext = this;代替dgFruit.ItemsSource = "{Binding}";

如果要在ComboBox中显示这些内容,则需要将这些DataGridComboBoxColumn绑定到颜色列表,而不仅仅是字符串。例如,您的类可能看起来像

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
}

如果您愿意,可以使用ListObservableCollection的优点是它已经为您实现了INotifyCollectionChangedINotifyPropertyChanged

答案 1 :(得分:4)

首先,这个:

dgFruit.ItemsSource = "{Binding}"

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

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

然后在你的visual的构造函数中:

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

现在,整个视觉效果的数据上下文是List&lt; Fruit&gt;,并且网格的ItemsSource设置为同一个对象。我在这里假设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*" />

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

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

这应该让你开始。