我有一个来自Web服务的DataTable,我需要绑定到ComboBox。我还没有grokked在XAML中进行绑定,所以这个问题是关于代码中的绑定。到目前为止我已经尝试了
cboManager.DataContext = Slurp.DistrictManagerSelect().DefaultView;
cboManager.DisplayMemberPath = "Name";
cboManager.SelectedValuePath = "NameListId";
cboManager.SetBinding(ComboBox.ItemsSourceProperty, new Binding());
我试过了
DataTable tbl = new DataTable();
tbl = Slurp.DistrictManagerSelect();
cboManager.ItemsSource = ((IListSource)tbl).GetList();
cboManager.DisplayMemberPath = "[Name]";
cboManager.SelectedValuePath = "[NameListId]";
DataContext = this;
在这两种情况下,我都会显示要显示的管理器列表,但是当我从ComboBox中选择时,我得到[Name]和[NameListId]而不是我期望的值。我做错了什么(除了不使用XAML的DataBinding之外)?
在我的原始帖子的答案进入后,编辑添加。
所以(基于Rachel的回答)尝试第三个看起来像这样:
using (DataTable tbl = Slurp.DistrictManagerSelect())
{
List<ManagerList> list = new List<ManagerList>();
foreach (var row in tbl.Rows)
{
list.Add(new ManagerList
{
NameListId = (int)row[0],
Name = row[1].ToString()
});
}
}
假设我正在做她所说的正确方法我没有收到此错误无法将[]索引应用于'object'类型的表达式
答案 0 :(得分:0)
您是否尝试过直接绑定到DataTable?你有列Name和NameListId吗?不要使用DataContext(你已经分配了ItemsSource)。
DataTable tbl = Slurp.DistrictManagerSelect();
cboManager.ItemsSource = tbl;
cboManager.DisplayMemberPath = "Name";
cboManager.SelectedValuePath = "NameListId";
当您转换为IListSource时,我怀疑它正在组合所有列。如果要绑定到列表,则需要创建具有Name和NameListID属性的项。
答案 1 :(得分:0)
我认为这是因为您的ItemsSource
是DataTable
,因此每个ComboBoxItem都包含DataRow
的DataContext,而DataRow
类没有名为{Name
的属性{1}}或NameListId
基本上,您试图告诉ComboBox显示DataRow.Name
,并将值设置为DataRow.NameListId
,这两个都不是有效的属性。
我通常更喜欢将数据解析为对象,并绑定ItemsSource
和List<MyObject>
或ObservableCollection<MyObject>
foreach(DataRow row in tbl.Rows)
list.Add(new MyObject { Name = row[0].ToString(), NameListId = (int)row[1] });
cboManager.ItemsSource = list;