Zone de texte, Bouton et ListBox dans une ListBox
J'ai une listbox avec un tas de contols dans chaque élément de la liste.
<ListBox x:Name="projectList" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<ListBox x:Name="taskList" ItemsSource="{Binding Tasks}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox x:Name="textBoxTask" />
<Button
x:Name="ButtonAddNewTask"
Content="Test"
CommandParameter="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext}"
Click="ButtonAddNewTask_Click"
/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Quand je clique sur le bouton dans la zone de liste, je veux ajouter un nouvel élément à la liste dans la zone de liste. J'ai parcouru beaucoup de chemin. Donc ma question est comment puis-je obtenir de l'emprise de la zone de texte et comment puis-je mettre à jour la zone de liste?
Voici mon événement click
private void ButtonAddNewTask_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
Project proj = button.DataContext as Project;
if(proj.Tasks == null)
proj.Tasks = new List<Task>();
proj.Tasks.Add(new Task("Added Task"));
}
Merci
- Que voulez-vous dire par "mettre la main de la boîte de texte"?
- L'objectif était de créer la tâche avec le texte de la zone de texte. Zone de texte newTaskTextBox = quelque chose ici; proj.Les tâches.Ajouter(nouvelle Tâche(newTaskTextBox.Texte));
InformationsquelleAutor Emil C | 2009-03-10
Vous devez vous connecter pour publier un commentaire.
La solution la plus simple serait susceptible d'être pour avoir un objet de représenter chaque élément que l'extérieur de la zone de liste. Elle possède alors des propriétés qui pourraient représenter chaque contrôle dans l'élément de texte dans la zone de texte, et les éléments dans la zone de liste (une liste de Tâches, je pense, en fonction de votre gestionnaire de Clic).
Dans votre gestionnaire de Clic, vous pouvez obtenir le Bouton du DataContext (ce qui devrait être un élément dans la collection de la liste externe), et ajouter une nouvelle Tâche à l'objet de la liste de tâches. Depuis l'intérieure de la zone de liste est liée à cette liste, il doit être mis à jour avec le nouvel élément (en supposant qu'il envoie des événements lorsque des éléments sont ajoutés, comme avec ObservableCollection).
Mise à jour: en Fonction de vos commentaires, la suite devrait fonctionner.
Votre
Project
classe devrait avoir deux propriétés:La
Task
classe n'a qu'un seul bien - le nom de la tâche.La
ProjectView
classe est un wrapper autour de laProject
classe (j'ai eu cette idée de @timothymcgrath de réponse). Il garde la trace du nom d'une nouvelle tâche, et le courantProject
:Vous aurez besoin d'une nouvelle classe qui sera utilisée comme
DataContext
. Quelque chose comme ceci:Dans le code-behind, définir la
DataContext
de l'objet à une instance de la classe ci-dessus:Dans le code XAML, les liaisons doivent être modifiés afin de lier les propriétés ci-dessus:
Enfin, dans le gestionnaire de clic pour le bouton, créez la tâche. Le
DataContext
de laButton
sera leProjectView
pour cet article.Puisque toutes les commandes d'obtenir leurs valeurs via la liaison, vous n'avez pas besoin d'accès le contrôle d'elle-même pour obtenir les données - il suffit d'utiliser les structures de données qui fournissent des contrôles déjà.
Il serait probablement préférable de déplacer le code qui crée la Tâche dans une autre classe (éventuellement
Project
), mais j'ai juste laissé dans le gestionnaire d'événement pour la facilité de frappe de ma part.Mise à jour 2: Modifié le code ci-dessus pour déplacer le
NewTaskName
propriété dans une autre classe qui encapsule une instance deProject
pour une utilisation avec l'INTERFACE utilisateur. Cela fonctionne mieux pour vous?Je suis en supposant que votre Projet de zone de liste est renseignée avec une Collection d'objets du Projet. Je voudrais ajouter un AddNewTask ICommand pour le Projet de la classe et de l'exposer à travers une propriété. Ensuite lier le Ajouter bouton Nouvelle Tâche pour le nouveau AddNewTask ICommand. Pour le CommandParameter, mettre le Nom_tâche et il sera passé dans la commande.
Essayez de lire sur certains MVVM (Model View ViewModel) pour des exemples de la façon dont cela fonctionne. Il est très propre et fonctionne très bien.
Cette solution a fonctionné pour la tâche à portée de main afin de parler.