列表框与组合框DataTemplate绑定

问题描述:

我目前有一个ComboboxDatatemplateListbox。我已将Combobox限制为string[]。这工作正常。列表框与组合框DataTemplate绑定

我想要的是当Combobox改变时,Listbox的索引应该与数组中的字符串相关联。 也就是说如果我在Listbox的第三行中选择Combobox中的第4项,我的数据应该用<字符串(Combobox字符串),int(Listbox索引)>表示,但为了保存重复数据,我希望将此数据用作我的Combobox绑定。

我在想我可以使用一个键值对,但我不确定如何将它绑定到Combobox那是DataTemplate(或者如果这是这样做的最好方法)。

注意

显然,这意味着每个Combobox串只能一次一个Listbox指数相关联。 因此,我想如果每个Combobox串只能在Listbox设置一次,即,如果我在Listbox然后Listbox索引5,它已经有Combobox 3应当被重置为空的索引4选择Combobox索引3。如果对于相同的字符串,我可能会在Combobox更改的事件中通过并重置另一个Comboboxes

样品

OK所以下面绑定工作;

<Window.Resources> 
    <DataTemplate x:Key="lbxHeaderDataTemplate"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="1.5*"></ColumnDefinition> 
       <ColumnDefinition Width="*"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 
      <Label Content="{Binding Item1}"></Label> 
      <ComboBox Name="cbxTest" Grid.Column="1" ItemsSource="{Binding 
       Item2}" DisplayMemberPath="Key"></ComboBox> 
     </Grid> 
    </DataTemplate> 

</Window.Resources> 
<StackPanel Width="auto" Height="auto"> 
    <ListBox Name="lbxFields" 
      ItemTemplate="{DynamicResource lbxHeaderDataTemplate}" 
      HorizontalContentAlignment="Stretch"> 
    </ListBox> 
</StackPanel> 

C#

private List<KeyValuePair<string, int>> cbxOptions2 = new List<KeyValuePair<string, int>>(); 
cbxOptions2.Add(new KeyValuePair<string, int>("", 0)); 
cbxOptions2.Add(new KeyValuePair<string, int>("Identifier", 0)); 
cbxOptions2.Add(new KeyValuePair<string, int>("Family Identifier", 0)); 
cbxOptions2.Add(new KeyValuePair<string, int>("File Path", 0)); 
for (int i = 0; i < 10; i++) 
{ 
    lbxDatFields.Items.Add(new Tuple<string, List<KeyValuePair<string, int>>>((i * 10).ToString(), cbxOptions2)); 
} 

这正是我最终使用。请随时提出更好的答案。

<Window.Resources> 
    <DataTemplate x:Key="lbxHeaderDataTemplate"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="1.5*"></ColumnDefinition> 
       <ColumnDefinition Width="*"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 
      <Label Content="{Binding Item1}"></Label> 
      <ComboBox Name="cbxTest" Grid.Column="1" ItemsSource="{Binding 
       Item2}" DisplayMemberPath="Key" 
       SelectionChanged="cbxTest_SelectionChanged"></ComboBox> 
     </Grid> 
    </DataTemplate> 

</Window.Resources> 
<StackPanel Width="auto" Height="auto"> 
    <ListBox Name="lbxFields" 
      ItemTemplate="{DynamicResource lbxHeaderDataTemplate}" 
      HorizontalContentAlignment="Stretch"> 
    </ListBox> 
</StackPanel> 

C#

private Dictionary<string, int> cbxOptions2 = new Dictionary<string, int>(); 
cbxOptions2.Add("", 0); 
cbxOptions2.Add("Identifier", 0); 
cbxOptions2.Add("Family Identifier", 0); 
cbxOptions2.Add("File Path", 0); 
for (int i = 0; i < 10; i++) 
{ 
    lbxDatFields.Items.Add(new Tuple<string, Dictionary<string, int>>((i * 10).ToString(), cbxOptions2)); 
} 

private void cbxTest_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ComboBox test = (ComboBox)sender; 
    DependencyObject parent = VisualTreeHelper.GetParent(test); 
    Label currentTxt = null; 
    foreach (object o in ((Grid)parent).Children) 
    { 
     if (o is Label) 
     { 
      currentTxt = (Label)o; 
     } 
    } 
}