Как правильно связать объект с WPF DataGrid? - PullRequest
0 голосов
/ 10 июня 2010

Я пытаюсь заставить WPF DataGrid работать из создаваемого пользователем элемента управления.Вещи, кажется, работают нормально.Но я заметил это сообщение в окне «Вывод» в среде IDE:

System.Windows.Data Ошибка: 39: ошибка пути BindingExpression: свойство 'Name' не найдено в 'object' '' Object '(HashCode = 18165668).BindingExpression: Path = Name;DataItem = 'Object' (HashCode = 18165668);целевым элементом является TextBlock (Name = '');Свойство target - «Текст» (тип «Строка»). System.Windows.Data Ошибка: 39: Ошибка пути BindingExpression: свойство «Отдел» не найдено для «объекта», «Объект» (HashCode = 18165668) '.BindingExpression: Path = Name;DataItem = 'Object' (HashCode = 18165668);целевой элемент - TextBlockComboBox (Name = '');Свойство target - SelectedItem (тип String)

Я пытаюсь вручную добавить столбцы в DataGrid из XAML и связать их с объектом, который есть в коде 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 ]

1 голос
/ 10 июня 2010

Показана ли строка заполнителя нового элемента?Потому что, если это так, именно это приводит к ошибке выходной привязки.

Текст данных для элемента-заполнителя является пустым объектом, который, естественно, не обладает свойствами других строк., все хорошо - у вас проблемы, если вы получаете одно и то же сообщение более одного раза (по одному на строку, а затем по одному для заполнителя):).

1 голос
/ 10 июня 2010

Трудно понять, почему вы делаете это, но я думаю, что могу помочь вам понять, почему вы получаете эту ошибку.

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

Вы привязываетесь к свойству с именемName но если вы будете следовать коду, источники ваших предметов (в MyDataGrid) будут указывать на MyData.MyData не отображается нигде внутри MyDataGrid UserControl.

Имеется свойство с именем TestData, но оно также не будет работать, поскольку TestData не имеет свойства с именем Name

По моему мнению, вы должны забыть о таблицах данных и всем прочем и просто создать свои объекты, поместить их в список, использовать этот список в качестве источников данных и все.

HTH

...