一个组合框依赖于WPF中的其他组合框

时间:2011-01-08 17:40:25

标签: c# .net wpf

我将这两个组合框绑定到2个不同的数据库表。首先绑定表与1列动物类(例如爬行动物,哺乳动物,两栖动物等)和另一个有两个列动物名称及其各自的动物类(例如蜥蜴 - 爬行动物,蛇 - 爬行动物,狗 - 哺乳动物,青蛙 - 两栖动物)。现在我想要的是当我在combobox1中选择项目时,combobox2应该具有与在组合框1中选择的项目相匹配的动物的相应列表以及每种动物的相应动物类别。

这是我到目前为止所做的事情

<ComboBox Grid.Column="2" Grid.Row="4" Margin="3,1,3,1"
         Name="comboBox1"
         ItemsSource="{Binding Source={StaticResource NameListData}, Path=Animal}"
         Selectionchanged="comboBox1_Selectionchanged" />
    <ComboBox Grid.Column="2" Grid.Row="5" Margin="3,1,3,1"
         Name="comboBox2"
         ItemsSource="{Binding Source={StaticResource NameListData}, Path=Stream}" />

selection_changed函数

private static string aa;
 private void comboBox1_Selectionchanged(object sender, SelectionchangedEventArgs e)
 {
 aA = comboBox1.SelectedItem.ToString();
 }

 public static string aA
 {
 get { return aa; }
 set { aa = value; }
 }

2个组合框绑定到的集合并位于MainViewModel类中

DataClasses1DataContext dc = new DataClasses1DataContext();
public List<string> Animal
{
get
{
List<string> facult = new List<string>();

foreach (var a in dc.Faculties)
{ 

facult.Add(a.Animal1.ToString());
}

return facult;
}
}


string selection;

public List<string> Stream
{

get
{
selection = Schooling.Pages.NewStudentGeneral.aA;
List<string> stream = new List<string>();

var q = from c in dc.Streams where c.faculty ==selection select c;
foreach (var b in q )
{
stream.Add(b.stream1);
}

return stream;
}
}

这里选择字符串没有得到在combobox1中选择的值,因为每当我硬编码并指定选择部分时,如下面的语句

1 var q = from c in dc.Streams where c.faculty =="Reptiles" select c; 

将为爬行动物提供相应的动物。

我猜如果选择变量得到了combobox1的选定值,我的问题就解决了。或者我在这里做错了什么?请帮忙。

1 个答案:

答案 0 :(得分:0)

您需要以某种方式告诉您的第二个ComboBox它需要更新其项目,您可以通过INotifyPropertyChanged / INotifyCollectionChanged的实现来执行此操作,也可以手动执行此操作。由于您在第一个ComboBox中有选择更改的显式事件,您也可以手动更新第二个,这可以通过更改处理程序来完成,如下所示:

 private void comboBox1_Selectionchanged(object sender, SelectionchangedEventArgs e)
 {
      aA = comboBox1.SelectedItem.ToString();
      comboBox2.GetBindingExpression(ComboBox.ItemsSourceProperty).UpdateTarget();
 }