使用Code在WPF中设置DisplayMemberPath和SelectedValue

时间:2011-12-28 15:32:48

标签: wpf data-binding combobox

我有一个来自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'类型的表达式

2 个答案:

答案 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)

我认为这是因为您的ItemsSourceDataTable,因此每个ComboBoxItem都包含DataRow的DataContext,而DataRow类没有名为{Name的属性{1}}或NameListId

基本上,您试图告诉ComboBox显示DataRow.Name,并将值设置为DataRow.NameListId,这两个都不是有效的属性。

我通常更喜欢将数据解析为对象,并绑定ItemsSourceList<MyObject>ObservableCollection<MyObject>

foreach(DataRow row in tbl.Rows)
    list.Add(new MyObject { Name = row[0].ToString(), NameListId = (int)row[1] });

cboManager.ItemsSource = list;