0 votes

Comment lier correctement un objet à une grille de données WPF ?

J'essaie de faire fonctionner une grille de données WPF à partir d'un contrôle utilisateur que je suis en train de construire. Les choses semblent fonctionner correctement. Mais j'ai remarqué ce message dans la fenêtre Output de l'IDE :

System.Windows.Data Error : 39 : BindingExpression path error : 'Name' property not found on 'object' ''Object' (HashCode=18165668)'. BindingExpression:Path=Name ; DataItem='Object' (HashCode=18165668) ; l'élément cible est 'TextBlock' (Name='') ; la propriété cible est 'Text' (type 'String') Erreur System.Windows.Data : 39 : Erreur de chemin de BindingExpression : la propriété 'Department' n'est pas trouvée sur 'object' ''Object' (HashCode=18165668)'. BindingExpression:Path=Name ; DataItem='Object' (HashCode=18165668) ; l'élément cible est 'TextBlockComboBox' (Name='') ; la propriété cible est 'SelectedItem' (type 'String')

Ce que j'essaie de faire, c'est d'ajouter manuellement des colonnes à la grille de données à partir de XAML et de les lier à un objet que j'ai dans le code C#.

Voici mon code 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>

Et voici mon code 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;
            }
        }
    }

Nous vous remercions de nous faire part de vos commentaires. Je vous remercie de votre attention.

1voto

Markust Points 1686

Il est difficile de comprendre pourquoi vous faites cela, mais je pense pouvoir vous aider à comprendre pourquoi vous obtenez cette erreur.

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

Vous vous attachez à une propriété nommée Name mais si vous suivez le code, les sources de vos éléments (dans MyDataGrid) pointent vers MyData . MyData n'apparaît nulle part à l'intérieur du MyDataGrid UserControl.

Ce que vous avez, c'est une propriété nommée TestData mais cela ne fonctionnera pas non plus car TestData n'a pas de propriété nommée Name

À mon avis, vous devriez oublier les tables de données et toutes ces choses et simplement créer vos objets, les placer dans une liste, utiliser cette liste comme source de données et c'est tout.

HTH

1voto

Goblin Points 4612

La ligne "New item placeholder" est-elle affichée ? Car si c'est le cas, c'est elle qui provoque l'erreur de liaison de sortie.

Le contexte de données d'un élément d'espace réservé est un objet vide - qui n'a naturellement pas les propriétés des autres lignes.

Donc, tout va bien - vous avez un problème si vous recevez le même message plus d'une fois (un par ligne et un pour l'espace réservé) :).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X