0

Postgres データベースから取り込まれた DataTable からデータを取得する ObservableCollection があります。この 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>

データグリッド列:

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

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

1 に答える 1

0

初めに。パブリック プロパティにバインドするだけです。

country_ は公共財産ではないようです。

2番目にバインディングが機能しない場合は、最初にデータコンテキストをチェックし、2番目にバインディングパスをチェックする必要があります。実行時にSnoopを使用してこれを行うことができます

編集:

グリッドのアイテムソースを投稿していません。ここにいくつかの仮定があります。

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

--> これは、MySource オブジェクト項目にパブリック プロパティ MySourcePropertyForCountries がある場合に機能します。

ただし、コンボボックスを MySource オブジェクトの外側にあるリストにバインドする場合。次に、ある種の relativeSourcebinding または elementbinding を使用する必要があります。

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

--> これは、データグリッドのデータコンテキストにプロパティ MyCountries がある場合に機能します

于 2013-05-27T07:11:02.397 に答える