我正在尝试将列表绑定到ComboBox并使用displaymemberpath显示值。
这是我的XAML:
<ComboBox x:Name="ComboBoxCommissieGroep"
ItemsSource="{Binding Commissies}"
DisplayMemberPath="CommissieGroep">
ViewModel:
我的ViewModel检索“漫画”列表
private async Task LoadData()
{
commissies = new ObservableCollection<object>(await LoginBLL.GetCommissiesList());
}
型号:
public class InloggenBO : ObservableObject
{
private int lidNummer;
public int LidNummer
{
get => lidNummer;
set
{
lidNummer = value;
NotifyPropertyChanged();
}
}
private string commissieGroep;
public string CommissieGroep
{
get => commissieGroep;
set
{
commissieGroep = value;
NotifyPropertyChanged();
}
}
private string wachtwoord;
public string Wachtwoord
{
get => wachtwoord;
set
{
wachtwoord = value;
NotifyPropertyChanged();
}
}
}
我的代码数据库方法: 该方法创建一个已经从数据库中检索到的数据集的列表。这就是为什么它是对象类型而不是InloggenBO
的原因protected Task<List<object>> ExecuteReader(string SqlString)
{
// Read to dataset
DataSet dataset = new DataSet();
using (var conn = new SqlConnection(ConnectionString))
using (var adapter = new SqlDataAdapter(new SqlCommand(SqlString, conn)
{
// Set commandtype
CommandType = CommandType.Text
}))
{
// Open connection
conn.Open();
// Fill dataset
adapter.Fill(dataset);
// Close connection
conn.Close();
}
return Task.FromResult(ToList(dataset));
}
创建列表对象的方法
private List<object> ToList(DataSet dataSet)
{
var list = new List<object>();
foreach (var dataRow in dataSet.Tables[0].Rows)
{
list.Add(dataRow);
}
return list;
}
我已经将DataContext设置为视图模型,并且知道绑定是有效的,因为在我的没有displaymemberpath的组合框中,它说:“ System.Data.Datarow”。那么,我必须在displaymemberpath中添加什么才能显示其值?
答案 0 :(得分:1)
您可以将ToList
方法更改为此:
private List<InloggenBO> ToList(DataSet dataSet)
{
//new list of InloggenBO instead of objects
var list = new List<InloggenBO>();
foreach (var dataRow in dataSet.Tables[0].Rows)
{
//create a new instance of InloggenBO
var item = new InloggenBO();
//this assumes that the column is named as the member
item.CommissieGroep = dataRow["CommissieGroep"].ToString();
//fill the other members
//add the instane of InloggenBO to the list
list.Add(item);
}
return list;
}
但是,正如@Andy提到的那样,您应该考虑使用诸如Entity Framework之类的ORM。
答案 1 :(得分:1)
系统完成的绑定过程分为两个部分。第一部分是目标对象,我的意思是 object ,因为它未知,该对象由控件的DataContext
提供。
如果我的控件没有设置DataContext
,则它会继承XAML中指定的父控件,如果它也为null,则该过程会重复进行,直到最终获取页面的数据上下文为止。
绑定的第2步是当该对象不为null时,它随后从绑定声明本身给出的绑定 hint 反映为属性。
因此,在您的情况下,它正在查找数据上下文之外的名为Commissies
的属性。如果该属性不是null而是一个列表,则成功绑定到列表后,组合框将尝试在要显示的每一行中查找并显示一个名为CommissieGroep
的属性。
对于组合框,为了正确显示数据,必须符合三件事。
您似乎没有正确进行数据绑定和显示的类型的正确列表(或可观察列表);解决该问题的方法。