0

У меня есть ObservableCollection, который получает его данные из DataTable, который заполняется из базы данных Postgres. Мне нужно привязать этот ObservableCollection к ComboBoxColumn в DataGrid. Я видел довольно много примеров того, как это сделать, но я постоянно что-то пропускаю.wpf привязка combobox к наблюдаемой коллекции

Edit: Это новый обновленный код и он работает на 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 Column:

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

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

«DataContext должен сделать ставку, установленные на ObservableCollection country_» Это может быть неправильным. – David

+0

Нет Я не реализовал INotifyPropertyChanged. И это одна из причин, почему я задаю этот вопрос. Я полностью озадачен, когда дело доходит до ObservableCollections, поскольку я никогда не использовал их раньше. –

ответ

0

Прежде всего. вы можете просто привязать к публичным свойствам.

страна_ не выглядит публичной.

второй, если привязка не работает, вам всегда нужно проверить datacontext и второй путь привязки. Вы можете использовать Snoop сделать это во время выполнения

EDIT:

вы не разместите ваш ItemsSource для вашей сети. поэтому некоторые предположения здесь.

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

-> Это будет работать, если объект объекта MySource имеет публичное свойство MySourcePropertyForCountries.

, но если вы хотите связать свой combobox со списком, который находится вне объекта MySource. то вам нужно использовать какой-то родственный источник или привязку элементов.

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

-> это будет работать, когда DataContext в DataGrid имеет свойство MyCountries

+0

Элементы источника для моей сетки - это другой тип данных. –

+0

хорошо, тогда вам нужно использовать привязку имени элемента или связывание с родственниками, чтобы подойти к вашему datacontext, у которого есть свойство Mycountries. использование StaticResource также является опцией – blindmeis

+0

Благодарим вас за ответ, но я уже отредактировал свой вопрос и разместил код, который со мной работал. –

Смежные вопросы