【问题标题】:C# WPF DataGrid Binding with ObservableCollection doesnt workC# WPF DataGrid 绑定与 ObservableCollection 不起作用
【发布时间】:2016-08-31 07:56:51
【问题描述】:

我有这个ObservableCollection

public static ObservableCollection<NahrungsmittelKategorie> NahrungsmittelKategorie
{
    get;
    set;
}

这个nahrungsmittelkategorie.cs

public class NahrungsmittelKategorie
{
    public int NahrungsmittelID { get; set; }
    public string NahrungsmittelName { get; set; }
    public ObservableCollection<Kategorie> NahrungsmittelKategorien { get; set; }
}

这个方法:

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 中的值。有人可以告诉我有什么问题吗?我已经测试了很多解决方案。

这些是之后的 DataGrid:

如果我得到这个代码:

<DataGrid x:Name="DataNahrungsmittel" ItemsSource="{Binding NahrungsmittelKategorie}" ColumnWidth="1*" AutoGenerateColumns="True" CanUserReorderColumns="False" CanUserSortColumns="False">

我得到了这个数据网格:

【问题讨论】:

  • 打开DataGrid所在的窗口/页面/控件时输出是否有绑定错误?
  • 我只得到一个带有很多空行的空数据网格。显示有问题的图片
  • 你是否正确设置了DataContext?
  • 你是什么意思?

标签: c# wpf binding datagrid


【解决方案1】:

如果您填充一个列表,然后将其分配给绑定到数据网格的列表,那么您需要为此实现 INotifyPropertyChanged。

<DataGrid x:Name="DataNahrungsmittel" ItemsSource="{Binding Path=NahrungsmittelKategorie}"></DataGrid>

进行上述绑定时,此时NahrungsmittelKategorie为空。

在下一行,NahrungsmittelKategorie 被更新,但它不会通知数据网格绑定的集合已更改。

NahrungsmittelKategorie = ListNahrungsmittel;

需要实现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 时编写的方法。

【讨论】:

  • 你的想法让我找到了正确的想法。我创建了一个刷新方法,在其中绑定了新的 itemssource。谢谢
  • 这可以完成工作,但它的性能非常糟糕。将 ItemsSource 设置为 null,然后重置为一个集合,强制数据网格重新创建整个绑定。通知意味着只获取最新的更改。如果您在 MSDN 上阅读了它们的差异,您可以观察到这两种情况的持续时间。
【解决方案2】:

您是否设置了视图的 DataContext?

您的 Xaml 应如下所示:

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

您的 Xaml.Cs 构造函数看起来像这样:

public YourClassName()
{
  InitialiseComponent();
  yourName.dataContext = this;
}

【讨论】:

  • 他正在将静态集合绑定到数据网格。我认为设置 DataContext = this 不会有任何影响,因为静态变量是对象级别的,而不是类级别的并且没有 this。
猜你喜欢
  • 2015-01-26
  • 2013-01-14
  • 2016-09-01
  • 1970-01-01
  • 2017-04-16
  • 2013-10-14
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多