Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C WPF DataGrid与ObservableCollection的绑定不起作用_C#_Wpf_Binding_Datagrid - Fatal编程技术网

C# C WPF DataGrid与ObservableCollection的绑定不起作用

C# C WPF DataGrid与ObservableCollection的绑定不起作用,c#,wpf,binding,datagrid,C#,Wpf,Binding,Datagrid,我有一个明显的收集 此方法: ObservableCollection<NahrungsmittelKategorie> ListNahrungsmittel = new ObservableCollection<NahrungsmittelKategorie>(); MySqlConnection connection = SQLConnection.getConnection(); MySqlCommand cmdGetNahrungs

我有一个明显的收集

此方法:

ObservableCollection<NahrungsmittelKategorie> ListNahrungsmittel = new ObservableCollection<NahrungsmittelKategorie>();
        MySqlConnection connection = SQLConnection.getConnection();
        MySqlCommand cmdGetNahrungsmittel = new MySqlCommand("Select ID, Name from t_Nahrungsmittel", connection);
        connection.Open();
        MySqlDataReader reader = cmdGetNahrungsmittel.ExecuteReader();
        while (reader.Read())
        {
            NahrungsmittelKategorie n = new NahrungsmittelKategorie();
            n.NahrungsmittelID = reader.GetInt32(0);
            n.NahrungsmittelName = reader.GetString(1);
            ListNahrungsmittel.Add(n);
        }
        connection.Close();

        for (int i = 0; i < ListNahrungsmittel.Count; i++)
        {
            ObservableCollection<Kategorie> ListKategorie = new ObservableCollection<Kategorie>();
            MySqlCommand cmdGetKategorien = new MySqlCommand("Select t_kategorie.id, t_kategorie.Kategorie from t_kategorie " +
                "inner join t_nahrungsmittelkategorie on t_kategorie.id = t_nahrungsmittelkategorie.kategorie " +
                "inner join t_nahrungsmittel on t_nahrungsmittelkategorie.nahrungsmittel = t_nahrungsmittel.id " +
                "where t_nahrungsmittel.id = " + ListNahrungsmittel[i].NahrungsmittelID, connection);
            connection.Open();
            reader = cmdGetKategorien.ExecuteReader();
            while (reader.Read())
            {
                Kategorie k = new Kategorie();
                k.KategorieID = reader.GetInt32(0);
                k.KategorieKategorie = reader.GetString(1);
                ListKategorie.Add(k);
            }
            connection.Close();
            ListNahrungsmittel[i].NahrungsmittelKategorien = ListKategorie;
        }

        NahrungsmittelKategorie = ListNahrungsmittel;
    }
最后,这个xaml代码:

<DataGrid x:Name="DataNahrungsmittel" ItemsSource="{Binding Path=NahrungsmittelKategorie}" ColumnWidth="1*" AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserSortColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding="{Binding NahrungsmittelID}"/>
        <DataGridTextColumn Header="Nahrungsmittel" Binding="{Binding NahrungsmittelName}"/>
    </DataGrid.Columns>
</DataGrid>
我没有得到数据网格中的值。有人能告诉我怎么了吗?我已经测试了很多解决方案

以下是数据网格:

如果我得到这个代码:

<DataGrid x:Name="DataNahrungsmittel" ItemsSource="{Binding NahrungsmittelKategorie}" ColumnWidth="1*" AutoGenerateColumns="True" CanUserReorderColumns="False" CanUserSortColumns="False">
我得到这个数据网格:


如果填充列表,然后将其分配给绑定到datagrid的列表,则需要为此实现INotifyPropertyChanged

<DataGrid x:Name="DataNahrungsmittel" ItemsSource="{Binding Path=NahrungsmittelKategorie}"></DataGrid>
您需要实现INotifyPropertyChanged,并在setter中的赋值时通知属性

private static ObservableCollection<NahrungsmittelKategorie> nahrungsmittelKategorie = new ObservableCollection<NahrungsmittelKategorie>();

public static ObservableCollection<NahrungsmittelKategorie> NahrungsmittelKategorie
{
    get { return nahrungsmittelKategorie; }
    set { nahrungsmittelKategorie = value; NotifyPropertyChanged("NahrungsmittelKategorie")};
}

其中NotifyPropertyChanged将是实现INotifyPropertyChanged时要编写的方法。

是否设置了视图的DataContext

您的Xaml应该如下所示:

<YourRootElement x:Name="yourName">
...
</YourRootElement>

当您打开DataGrid所在的窗口/页面/控件时,输出中是否存在任何绑定错误?我只得到一个包含大量空行的空DataGrid。显示有问题的图片你是否正确设置了DataContext?你的意思是什么?你的想法让我得到了正确的想法。我创建了一个refresh方法,在其中绑定itemsSource new。感谢这项工作,但它的表现非常糟糕。将ItemsSource设置为null,然后重置为集合将强制datagrid重新创建整个绑定。通知意味着只获取最新的更改。如果您在MSDN上阅读了它们之间的差异,您可以观察两种情况所需的时间。他正在将静态集合绑定到datagrid。我认为设置DataContext=this不会有任何效果,因为静态变量是对象级别的,而不是类级别的,没有this。
NahrungsmittelKategorie = ListNahrungsmittel;
private static ObservableCollection<NahrungsmittelKategorie> nahrungsmittelKategorie = new ObservableCollection<NahrungsmittelKategorie>();

public static ObservableCollection<NahrungsmittelKategorie> NahrungsmittelKategorie
{
    get { return nahrungsmittelKategorie; }
    set { nahrungsmittelKategorie = value; NotifyPropertyChanged("NahrungsmittelKategorie")};
}
<YourRootElement x:Name="yourName">
...
</YourRootElement>
public YourClassName()
{
  InitialiseComponent();
  yourName.dataContext = this;
}