3 Stimmen

Probleme mit der Bindung innerhalb der Listbox-Elementvorlage

Ich habe zwei separate Bindung Probleme mit Listboxen mit einem Itemtemplate, die eine Texbox enthält.

1) Ein Listenfeld ist mit einer Liste von Zeichenfolgen verbunden. Wie kann ich die einzelnen Zeichenfolgen in den erstellten Textfeldern anzeigen und gleichzeitig eine bidirektionale Bindung ermöglichen? Zwei-Wege-Bindung ist ohne Angabe eines Pfads oder XPaths nicht zulässig.

<ListBox Height="231" HorizontalAlignment="Left" Margin="0,167,0,0" Name="listBoxKeys" VerticalAlignment="Top" Width="219" ItemsSource="{Binding Path=SelectedPlatform.Keys}" SelectedItem="{Binding Path=SelectedKey,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
         <ListBox.ItemTemplate>
              <DataTemplate>
                  <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
                     <TextBox Text="{Binding Mode=OneWay}" Margin="0,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                   </StackPanel>
               </DataTemplate>
          </ListBox.ItemTemplate>
 </ListBox>

Und 2) Ich verwende eine andere Listbox, die mit einer generischen Liste einer benutzerdefinierten KeyValuePair-Klasse verbunden ist. Das Itemtemplate enthält ein Textfeld und eine Combobox. Der Text in der Textbox ist an die Key-Eigenschaft jedes KeyValuePair-Objekts gebunden und die Combobox selecteditem an die Value-Eigenschaft. Mein Problem ist, dass ich möchte, dass die Combobox mit einer Liste von Strings gefüllt wird, die in meinem Viewmodel deklariert sind und die sich zur Laufzeit ändern werden. Der Datakontext des Fensters ist das Viewmodel, in dem die Liste deklariert ist. Ich kenne die genaue Syntax nicht, die ich verwenden muss, um die Combobox itemssource dort zu binden. Hier ist mein Code:

<ListBox Height="393" HorizontalAlignment="Left" Margin="0,72,0,0" Name="listBoxActions" VerticalAlignment="Top" Width="254" ItemsSource="{Binding Path=SelectedPlayer.ControlProfile.MappedActions}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
          <TextBox Text="{Binding Key, Mode=TwoWay,UpdateSourceTrigger=LostFocus}" Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
          <ComboBox Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding ?}" SelectedItem="{Binding Value, Mode=TwoWay}"/>
         </StackPanel>
        </DataTemplate>
       </ListBox.ItemTemplate>
</ListBox>

4voto

Pavlo Glazkov Punkte 20178

Das Problem ist, dass die zweiseitige Bindung an die Quelle selbst nicht funktionieren kann, da dies bedeuten würde, dass das gesamte Objekt (String), für das die Datenvorlage erstellt wird, ersetzt werden muss, wenn der Benutzer den Text im Textfeld ändert. Dies wird natürlich nicht funktionieren. Die zweiseitige Bindung funktioniert nur bei einer beschreibbaren Eigenschaft des gebundenen Objekts.

In Ihrem Fall würde ich vorschlagen, ein Ansichtsmodell für die Elemente im Listenfeld zu erstellen (im Grunde ein Ansichtsmodell für Ihre Zeichenketten) und eine Value-Eigenschaft darauf freizulegen und in der Datenvorlage an sie zu binden:

<ListBox Height="231" HorizontalAlignment="Left" Margin="0,167,0,0" 
         Name="listBoxKeys" VerticalAlignment="Top" Width="219" 
         ItemsSource="{Binding Path=SelectedPlatform.KeyViewModels}" 
         SelectedItem="{Binding Path=SelectedKey,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
        <ListBox.ItemTemplate>
             <DataTemplate>
                 <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
                    <TextBox Text="{Binding Value, Mode=TwoWay}" Margin="0,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                  </StackPanel>
              </DataTemplate>
         </ListBox.ItemTemplate>
</ListBox>

3voto

James Hay Punkte 12299

1) Pavlo Glazkov scheint eine gute Antwort für mich zu haben

2) Das liegt daran, dass der DataContext für die ComboBox jetzt das Schlüssel-Wert-Paar ist und nicht das ViewModel. Es kann andere Möglichkeiten, dies zu tun, aber die eine, die ich vor verwendet haben, ist die Bindungen RelativeSource Quelle zurück zu es ist übergeordnete ItemsControl festgelegt.

RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}

Etwa so:

<ListBox Height="393" HorizontalAlignment="Left" Margin="0,72,0,0" Name="listBoxActions" VerticalAlignment="Top" Width="254" ItemsSource="{Binding Path=SelectedPlayer.ControlProfile.MappedActions}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
          <TextBox Text="{Binding Key, Mode=TwoWay,UpdateSourceTrigger=LostFocus}" Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/>
          <ComboBox Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding DataContext.Keys,  RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" SelectedItem="{Binding Value, Mode=TwoWay}"/>
         </StackPanel>
        </DataTemplate>
       </ListBox.ItemTemplate>
</ListBox>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X