2011-02-03 5 views
3

J'ai deux problèmes de liaison distincts avec des listboxes avec un itemtemplate qui contient une texbox.Liaison à l'intérieur de listbox itemtemplate problems

1) Une zone de liste se lie à une liste de chaînes. Comment puis-je afficher chaque chaîne dans les zones de texte créées et autoriser la liaison bidirectionnelle en même temps? La liaison bidirectionnelle n'est pas autorisée sans spécifier un chemin ou XPath.

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

et 2) j'utiliser un autre listbox qui se lie à une liste générique d'une classe KeyValuePair personnalisée. Le itemtemplate contient une zone de texte et une liste déroulante. Le texte de la zone de texte est lié à la propriété key de chaque objet KeyValuePair et la liste déroulante est sélectionnée pour la propriété value. Mon problème est que je veux que le combo soit rempli par une liste de chaînes déclarées dans mon viewmodel qui va changer à l'exécution. Le datacontext de la fenêtre est le viewmodel où la liste est déclarée. Je ne connais pas la syntaxe exacte que j'ai besoin d'utiliser pour lier la source d'objets combobox. Voici mon 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> 
+1

Cela devrait vraiment avoir été deux questions distinctes que vous allez trouver certaines personnes peuvent répondre à une et non l'autre de sorte que vous pourriez obtenir deux personnes répondant correctement. Cela rendra difficile de marquer la réponse comme correcte. –

Répondre

4

Le problème est que les deux voies de liaison sur la source elle-même ne peut pas fonctionner, car cela signifierait que l'ensemble de l'objet (chaîne), pour lequel le modèle de données est créé, doit être remplacé lorsque l'utilisateur change le texte dans la zone de texte. Évidemment, cela ne fonctionnera pas. La liaison bidirectionnelle fonctionne uniquement sur une propriété accessible en écriture de l'objet lié.

Dans votre cas, je suggérerais la création d'un modèle de vue pour les éléments de la zone de liste (essentiellement un modèle de vue pour vos cordes) et d'exposer une propriété de valeur sur elle et se lier à elle dans le modèle de données:

<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> 
+0

Merci pour cela. J'ai créé une classe inutile appelée ControllerKey qui a un nom de propriété de chaîne. Donc, en ce moment, mon SelectedPlatform.Keys est une liste générique de type ControllerKey au lieu de chaîne. De cette façon, j'ai surmonté mon problème :) – muku

2

1) Pavlo Glazkov semble avoir une bonne réponse me

2) Ce chiffre est inférieur à la DataContext pour le ComboBox étant maintenant la valeur paire de clés plutôt que le ViewModel. Il peut y avoir d'autres façons de le faire, mais celle que j'ai utilisée auparavant consiste à rétablir la source RelativeSource de la liaison à son parent ItemsControl.

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

Quelque chose comme:

<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> 
+0

Votre code recherche donc les éléments de la liste. Mais ce n'est pas ce dont j'ai besoin. Si vous voyez le ItemsSource de la liste est lié à SelectedPlayer.ControlProfile ... SelectedPlayer est une propriété de mon viewmodel. J'ai une autre propriété nommée Keys dans le viewmodel. C'est là que je veux lier l'ItemsSource de la combobox :) – muku

+0

@muku - Ma mauvaise ... manquait une partie vitale du puzzle. Consultez ma dernière mise à jour de l'échantillon. J'ai changé le chemin d'accès à DataContext.Keys –

+0

Hey merci :) Cela a fonctionné. Pourriez-vous me montrer un bon tutoriel sur ce que je dois faire pour mettre à jour les éléments de la liste déroulante après la mise à jour de la liste des clés? Je ne veux pas vous mettre en difficulté en demandant plus d'exemples, je pourrais jeter un oeil à un bon tutoriel. (Je suis un novice en wpf) – muku

Questions connexes