wpf将combobox绑定到可观察的集合

时间:2013-05-27 05:04:55

标签: wpf binding observablecollection datagridcomboboxcolumn

我有一个ObservableCollection,它从一个从Postgres数据库中填充的DataTable中获取数据。我需要将此ObservableCollection绑定到DataGrid中的ComboBoxColumn。我已经看过很多关于如何做到这一点的例子,但我经常遗漏一些东西。

编辑:这是新的更新代码,它正在工作,除了我设置为“名称”(尚未)的INotifyPropertyChanged

namespace Country_namespace

{

public class CountryList : ObservableCollection<CountryName>
{
    public CountryList():base()
    {

      // Make the DataTables and fill them           



    foreach(DataRow row in country.Rows)
    {
       Add(new CountryName((string)row.ItemArray[1], (int)row.ItemArray[0]));
   }           
    }
}

public class CountryName: INotifyPropertyChanged
{
    private string name;
    private int id_country;
    public event PropertyChangedEventHandler PropertyChanged;

    public CountryName(string country_name, int id)
    {
        this.name = country_name;
        this.id_country = id;
    }

    public string Name
    {
        get { return name; }
        set {
        name = value;
        OnPropertyChanged("CountryName");
        }
    }

    public int idcountry
    {
        get { return id_country; }
        set { id_country = value; }
    }
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

}

XAML:

xmlns:c="clr-namespace:Country_namespace"

<Windows.Resources>
<c:CountryList x:Key="CountryListData"/>
</Windows.Resources>

DataGrid列:

<dg:DataGridTemplateColumn Header="country">
                                <dg:DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox ItemsSource="{Binding Source={StaticResource CountryListData}}"  DisplayMemberPath="Name"></ComboBox>

                                    </DataTemplate>
                                </dg:DataGridTemplateColumn.CellTemplate>
                            </dg:DataGridTemplateColumn>

1 个答案:

答案 0 :(得分:0)

首先。你可以绑定到公共属性。

country_似乎没有公共财产。

第二,如果绑定不起作用,你总是要先检查datacontext,然后再检查绑定路径。您可以使用Snoop在运行时执行此操作

编辑:

您没有为您的网格发布您的itemssource。所以这里有一些假设。

<DataGrid ItemsSource="{Binding MySource}">
  ...
    <ComboBox ItemsSource="{Binding MySourcePropertyForCountries}"/>

- &GT;当MySource对象项具有公共属性MySourcePropertyForCountries时,这将起作用。

但是如果你想将你的组合框绑定到一个位于MySource对象之外的列表中。那么你必须使用某种relativeSourcebinding或elementbinding。

<DataGrid x:Name="grd" ItemsSource="{Binding MySource}">
  ...
    <ComboBox ItemsSource="{Binding ElementName=grd, Path=DataContext.MyCountries}"/>

- &GT;当datagrid的datacontext具有属性MyCountries

时,这将起作用