2017-07-19 3 views
0

Ich habe derzeit eine Combobox in einer Datatemplate für eine Listbox. Ich habe die Combobox an eine string[] gebunden. Das funktioniert gut.ListBox mit ComboBox DataTemplate Bindung

Was ich möchte ist, wenn eine Combobox geändert wird, sollte der Index der Listbox mit der Zeichenfolge im Array verknüpft werden. I.e. wenn ich den 4. Artikel in der Combobox in der 3. Zeile der Listbox wählen, sollten meine Daten durch < string (Combobox string), int (Listbox Index)> aber um doppelte Daten zu speichern, möchte ich diese Daten als meine verwenden Combobox Bindung.

Ich dachte ich ein Schlüsselwertpaar verwenden könnte, aber ich bin nicht sicher, wie ich dies auf die Combobox binden würde, die in einem DataTemplate ist (oder, wenn dies der beste Weg, dies zu tun).

Hinweis

Offensichtlich bedeutet dies, dass jede Combobox Zeichenfolge nur mit einem Listbox Index zu einer Zeit zugeordnet werden kann. Deshalb möchte ich, wenn jede Combobox Zeichenfolge nur einmal in der Listbox eingestellt werden könnte, das heißt, wenn ich Combobox Index 3 in Index 4 des Listbox dann Listbox Index 5 auszuwählen, die bereits hatte Combobox 3 sollte leer zurückgesetzt werden. Ich werde wahrscheinlich in das Combobox geänderte Ereignis gehen und das andere Comboboxes zurücksetzen, wenn es für die gleiche Zeichenfolge ist.

Probe

OK, so dass die folgende Bindung Werke;

<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)); 
} 

Antwort

0

Das war, was ich am Ende mit. Bitte zögern Sie nicht, eine bessere Antwort zu empfehlen.

<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; 
     } 
    } 
}