Я новичок в WPF и, особенно, его привязка данных.
У меня есть таблица с рекурсивной структурой. Структура таблицы показана ниже:
ID (int, not null) As PK,
Text (nvarchar),
ParentID (int)
У меня есть две комбинации на форме, первая комбинация заполнена элементами, возвращаемыми следующим запросом:
Select * from tbl where ParentID = null
Выбор элемента в этом комбо вызывает загрузку каждой строки в таблице, у которой ParentID равен идентификатору выбранного элемента. Следующий запрос возвращает элементы, которые заполняют второе комбо:
Select * from tbl where ParentID = Selected_ID_form_Combo1
Мое решение для этой проблемы (если это вообще может быть решением!):
Я загружаю данные в набор данных по следующим запросам, но в две разные таблицы данных:
SqlConnection cnn = new SqlConnection(ConnectionString);
DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand("Select * from tbl where ParentID is NULL", cnn);
SqlCommand cmd1 = new SqlCommand("Select * from tbl where ParentID != 0", cnn);
cmd.CommandType = CommandType.Text;
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
da.Fill(ds, "tbl");
da1.Fill(ds, "Child_tbl");
Затем я делаю представление, чтобы связать TargetID дочерней таблицы с идентификатором основной таблицы:
ds.Relations.Add(
"Rel_ID_ParentID",
ds.Tables["tbl"].Columns["ID"],
ds.Tables["Child_tbl"].Columns["ParentID"]);
Наконец, я установил DataContext этого istance для источника данных
this.DataContext = ds;
В коде XAML две комбинации определены следующим образом:
<ComboBox Name="cmbMain" ItemsSource="{Binding}"
DataContext="{Binding Path=Tables[tbl]}" DisplayMemberPath="Text"
SelectedValuePath="ID" />
<ComboBox Name="cmbChild" ItemsSource="{Binding Path=Rel_ID_ParentID}"
DisplayMemberPath="Text" SelectedValue="ID" SelectedValuePath="TargetID"
IsSynchronizedWithCurrentItem="True"/>
Но второй выпадающий список не заполнен какими-либо данными. Есть идеи?