如何正确地将对象绑定到WPF DataGrid?

时间:2010-06-09 23:14:57

标签: wpf xaml wpf-controls wpfdatagrid

我正在尝试从我正在构建的用户控件中使用WPF DataGrid。事情似乎很好。但是我在IDE的“输出”窗口中注意到了这条消息:

System.Windows.Data错误:39:BindingExpression路径错误:'对象'''对象'(HashCode = 18165668)'上找不到'名称'属性。 BindingExpression:路径=名称; DataItem ='Object'(HashCode = 18165668); target元素是'TextBlock'(Name =''); target属性是'Text'(类型'String') System.Windows.Data错误:39:BindingExpression路径错误:在'对象'''对象'(HashCode = 18165668)'上找不到'部门'属性。 BindingExpression:路径=名称; DataItem ='Object'(HashCode = 18165668); target元素是'TextBlockComboBox'(Name =''); target属性是'SelectedItem'(类型'String')

我要做的是从XAML手动向DataGrid添加列,并将它们绑定到我在C#代码中的对象。

这是我的XAML代码:


    <UserControl x:Class="Sting.Utilities.MyDataGrid" Name="This"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
        Height="600" Width="800">
        <Grid>
            <toolkit:DataGrid AutoGenerateColumns="False" Name="myDataGrid" Margin="10" ItemsSource="{Binding ElementName=This, Path=MyData}">
                <toolkit:DataGrid.Columns>
                    <toolkit:DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                    <toolkit:DataGridComboBoxColumn Header="Department" x:Name="_Departmens" SelectedItemBinding="{Binding Department}"/>
                </toolkit:DataGrid.Columns>
            </toolkit:DataGrid>
        </Grid>
    </UserControl>

这是我的C#代码:


    namespace Sting.Utilities
    {
        /// 
        /// Interaction logic for UserControl1.xaml
        /// 
        public partial class MyDataGrid : UserControl
        {
            DataTable _myData;
            public DataTable TestData { get { return _testData; } }

            public MyDataGrid()
            {
                // Initialize data table
                _myData = new DataTable();
                _testData.Columns.Add(new DataColumn("Name", typeof(string)));
                _testData.Columns.Add(new DataColumn("Department", typeof(string)));

                // Temp Code: User should add rows
                DataRow row = _testData.NewRow();
                row["Name"] = "John Smith";
                row["Department"] = "Accounting";
                _testData.Rows.Add(row);

                // Initialize combo boxes
                List departmentComboBoxList = new List() {"Accounting", "Purchasing", "Engineering"};
                _Departments.ItemsSource = departmentComboBoxList;
            }
        }
    }


任何想法都表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:1)

很难理解为什么要这样做,但我想我可以帮助你理解为什么会给你这个错误。

<toolkit:DataGridTextColumn Header="Name" Binding="{Binding Name}"/> <toolkit:DataGridComboBoxColumn Header="Department" x:Name="_Departmens" SelectedItemBinding="{Binding Department}"/>

您绑定到名为Name的属性,但如果您按照代码,您的项目源(在MyDataGrid中)指向MyDataMyData UserControl中没有出现MyDataGrid

你拥有的是一个名为TestData的属性,但由于不起作用 TestData没有名为Name

的属性

在我看来,你应该忘记数据表和所有这些东西,简单地创建你的对象,把它们放在一个List中,使用那个列表作为你的数据源就是这样。

HTH

答案 1 :(得分:1)

是否显示“新项目占位符”行?因为如果是,那就是导致输出绑定错误的那个。

占位符项的datacontext是一个空对象 - 它自然不具有其他行的属性。

所以,一切都很好 - 如果您多次获得相同的消息(每行一个,然后一个占位符),则会遇到麻烦:)。