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;
}