如何从System.Data中为DataRow的绑定设置DisplayMemberPath和SelectedValuePath?

时间:2013-03-18 18:17:33

标签: c# .net wpf

如何从System.Data中为DataRow的绑定设置DisplayMemberPath和SelectedValuePath?

这就是我在做什么,是不是错了?

DataSet ds = new DataSet();
DataTable dt = new DataTable("tb1");
dt.Columns.Add("ID");
dt.Columns.Add("Name");
ds.Tables.Add(dt);

DataRow dr1 = ds.Tables[0].NewRow();
dr1["ID"] = 1;
dr1["Name"] = "Edwin";

DataRow dr2 = ds.Tables[0].NewRow();
dr2["ID"] = 2;
dr2["Name"] = "John";

DataRow dr3 = ds.Tables[0].NewRow();
dr3["ID"] = 3;
dr3["Name"] = "Dave";

ds.Tables[0].Rows.Add(dr1);
ds.Tables[0].Rows.Add(dr2);
ds.Tables[0].Rows.Add(dr3);

comboBox1.DisplayMemberPath = "Name";
comboBox1.SelectedValuePath = "ID";

foreach (DataRow item in ds.Tables[0].Rows)
{
    comboBox1.Items.Add(item);
}

1 个答案:

答案 0 :(得分:0)

您要向DataRow添加ComboBox个对象,而DataRow没有标题为IDName的属性(从技术上讲,它们确实有Name {1}}属性,但它不是你想到的那个)

一种简单的记忆方式是使用DisplayMemberPathSelectedValuePath,您需要能够使用DataItem.PropertyName的语法访问该属性,因此在您的情况下,它正在尝试访问DataRow.IDDataRow.Name

例如,DisplayMemberPath只是数据模板的快捷方式,看起来像

<TextBlock Text="{Binding DisplayMemberPathValue}" />

你最好只添加像KeyValuePair<int,string>或自定义类这样简单的内容,甚至只添加ComboBoxItem

comboBox1.SelectedValuePath = "Key";
comboBox1.DisplayMemberPath = "Value";

foreach (DataRow item in ds.Tables[0].Rows)
{
    comboBox1.Items.Add(
        new KeyValuePair<int,string>((int)item["ID"], row["Name"] as string));
}