Я нашел решение. Я должен сказать очень расстраивающую вещь, которую нужно выучить, прежде чем вы познакомитесь с WPF и элементами управления связыванием ...
Я следовал многочисленным статьям, чтобы понять, что в WPF вы должны использовать шаблон MVVM для правильно связать ваши элементы управления . Тем не менее, существует так много разных подходов, делающих это, поэтому я закончил тем, что, по крайней мере, мало понятно для меня на данный момент:
1.) Создать класс Model . Здесь вы определяете свои столбцы DataTable и выставляете их как свойства. Этот класс должен быть унаследован от INotifyPropertyChanged :
class Test_Model : INotifyPropertyChanged
{
private string col1;
private string col2;
public string Col1
{
get
{
return col1;
}
set
{
col1 = value;
OnPropertyChanged("Col1");
}
}
public string Col2
{
get
{
return col2;
}
set
{
col2 = value;
OnPropertyChanged("Col2");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
2.) Создайте класс Viev_Model . Здесь вы создаете IList (типа Test_Model) и заполняете его. с DataTable я использовал для этого LINQ - это тоже было проблемой. Затем вы снова предоставляете свойство типа IList, чтобы использовать его в качестве источника данных:
class Test_ViewModel
{
private IList<Test_Model> _comboData;
public Test_ViewModel()
{
_comboData = dt.AsEnumerable().
Select(row => new Test_Model
{
Col1 = row.Field<string>(0),
Col2 = row.Field<string>(1)
}).ToList();
}
public IList<Test_Model> ComboData
{
get { return _comboData; }
set { _comboData = value; }
}
}
3.) В своем окне или странице присвойте DataContext классу View_Model . Это делается в конструкторе, например так:
public partial class My_Page: Page
{
public My_Page()
{
InitializeComponent();
this.DataContext = new Test_ViewModel(); //assign ViewModel class
}
//...
}
4.) Привязать комбинированный список к классу View_Model :
<ComboBox x:Name="Cmb_Test" ItemsSource="{Binding Path= ComboData}"
DisplayMemberPath="Col1" SelectedValuePath="Col1" SelectedIndex="0"/>
И тогда все заработало, наконец. Хотя я не доволен решением, поэтому мне нужно найти более простой способ правильного связывания. У меня обычно есть много элементов управления для привязки, и если бы я делал это для каждого нужного мне DataTable, я бы в итоге получил тонны кода в классах.