La liaison à l'intérieur de listbox itemtemplate problèmes
J'ai deux problèmes de liaison avec les listes avec un itemtemplate qui contient une texbox.
1) Une zone de liste se lie à une liste de chaînes de caractères. Comment puis-je afficher chaque chaîne à l'intérieur de zones de texte créées et permettent une liaison bidirectionnelle en même temps? Une liaison bidirectionnelle n'est pas autorisée sans spécifier un Chemin d'accès 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'utilise une autre zone de liste qui se lie à certains de liste générique d'une coutume KeyValuePair classe. L'itemtemplate contient un textbox et combobox. La zone de texte le texte est lié à la propriété de la clé de chaque objet KeyValuePair et de la zone de liste déroulante selecteditem à la valeur de la propriété. Mon problème est que je veux la liste déroulante pour obtenir rempli par une liste de chaînes déclarées dans mon viewmodel qui sera en train de changer au moment de l'exécution. Du datacontext de la fenêtre est le viewmodel où la liste est déclarée. Je ne connais pas la syntaxe exacte que je dois utiliser pour lier la zone de liste déroulante itemssource. 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>
OriginalL'auteur muku | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
Le problème est que la liaison bidirectionnelle sur la source elle-même ne peut pas fonctionner, car cela signifierait que l'ensemble de l'objet (chaîne de caractères), pour qui le modèle de données est créé, il doit être remplacé lorsque l'utilisateur modifie le texte dans la zone de texte. Évidemment, cela ne fonctionnera pas. Les deux sens de la liaison ne fonctionne que sur une écriture de la propriété de l'objet lié.
Dans votre cas, je suggère la création d'un modèle d'affichage pour les éléments dans la zone de liste (en fait un modèle de vue pour vos chaînes) et d'exposer une Valeur de propriété sur elle et de se lier à elle dans le modèle de données:
OriginalL'auteur Pavlo Glazkov
1) Pavlo Glazkov semble avoir une bonne réponse pour moi
2) C'est le DataContext de la zone de liste déroulante maintenant la valeur de la clé de paire plutôt que le ViewModel. Il y a peut être d'autres façons de procéder, mais celui que j'ai utilisé avant est de définir les liaisons RelativeSource source remonte à celle du parent ItemsControl.
Quelque chose comme:
Mon mauvais... manquait une pièce essentielle du puzzle. Découvrez ma dernière mise à jour de l'échantillon. J'ai changé le chemin d'accès à DataContext.Touches
Hey merci 🙂 cela a fonctionné. Pourriez-vous m'indiquer un bon tutoriel sur ce que je dois faire pour mettre à jour les éléments de la zone de liste déroulante après la liste des Clés est mis à jour? Je ne veux pas vous mettre en difficulté de demander pour plus d'exemples, je pourrais prendre un coup d'oeil à un bon tutoriel. (Je suis un newbie dans wpf)
Pas de problème muku. Pas vraiment sûr de ce que vous êtes après ici. Si vous souhaitez affecter les valeurs de Clés après le contrôle a été créé alors votre Dernier doit mettre en œuvre INotifyPropertyChange et tout ce que vous devez faire est de soulever un PropertyChangeEvent msdn.microsoft.com/en-us/library/ms743695.aspx. Si la liste de Clés est en train de changer en interne, c'est à dire les articles ajoutés et supprimés, alors vous voudrez probablement consulter ObservableCollections msdn.microsoft.com/en-us/library/ms748365.aspx. Ce comportement serait un peu étrange pour un combo bien 😉
OriginalL'auteur James Hay