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

时间:2016-08-31 07:56:52

标签: c# wpf binding datagrid

我有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:

enter image description here

如果我收到此代码:

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

我得到了这个datagrid:

enter image description here

2 个答案:

答案 0 :(得分:1)

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

{% extends "base.html" %}

{% block comment %}
{% autoescape true %}
    <form method="post">
            <div>
                <input type="submit" name="button" value="{{button}}">
                <input type="hidden" name="run" value="{{run}}">
            </div> 
            <!-- <div>macAddress: <input type="text" name="macAddress"><br>
                <input type="submit" value="Submit">
            </div> -->

    </form> 
{% endautoescape %}
{% endblock %}

当您执行上述绑定时,<DataGrid x:Name="DataNahrungsmittel" ItemsSource="{Binding Path=NahrungsmittelKategorie}"></DataGrid> 为空。

并在以下行中更新NahrungsmittelKategorie,但它不会通知datagrid绑定集合已更改。

NahrungsmittelKategorie

您需要实现INotifyPropertyChanged并在分配时通知属性(在setter中)

NahrungsmittelKategorie = ListNahrungsmittel;

private static ObservableCollection<NahrungsmittelKategorie> nahrungsmittelKategorie = new ObservableCollection<NahrungsmittelKategorie>(); public static ObservableCollection<NahrungsmittelKategorie> NahrungsmittelKategorie { get { return nahrungsmittelKategorie; } set { nahrungsmittelKategorie = value; NotifyPropertyChanged("NahrungsmittelKategorie")}; } 将是您实施NotifyPropertyChanged时要编写的方法。

答案 1 :(得分:0)

您是否设置了视图的DataContext?

您的Xaml应该如下:

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

你的Xaml.Cs构造函数应该是这样的:

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