2010-04-20 4 views
7

Je suis en train d'apprendre WPF, donc je suis un peu n00b dans ce domaine. J'ai vu quelques exemples sur la façon de faire ce que je veux faire, mais rien exactement ...Liaison ListBox à la liste (Collection) en XAML

La question: Je veux lier List à ListBox. Je veux le faire en XAML, sans codage dans le code derrière. Comment puis-je y parvenir?

En ce moment, je le fais cette façon:

XAML

<ListBox x:Name="FileList"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Path=.}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

code derrière

public MainWindow() 
{ 
    // ... 
    files = new List<string>(); 
    FileList.ItemsSource = files; 
} 

private void FolderBrowser_TextChanged(object sender, RoutedEventArgs e) 
{ 
    string folder = FolderBrowser.Text; 
    files.Clear(); 
    files.AddRange(Directory.GetFiles(folder, "*.txt", SearchOption.AllDirectories)); 
    FileList.Items.Refresh(); 
} 

Mais je veux me débarrasser de FileList.ItemsSource = files; et FileList.Items.Refresh(); en Code C#

Merci

+1

ce fil peut vous aider. http://stackoverflow.com/questions/9391746/how-can-a-data-bind-a-list-of-strings-to-a-listbox-in-wpf-wp7 – FebinDonz

Répondre

17

Tout d'abord, la configuration de la liaison dans votre zone de liste:

<ListBox x:Name="FileList" ItemsSource="{Binding Files}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Path=.}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

ou

<ListBox x:Name="FileList" ItemsSource="{Binding Files}" DisplayMemberPath="."/> 

Ensuite, assurez-vous que "Files" est une propriété dans votre DataContext (ou code derrière). (Vous ne pouvez pas lier à des champs, seulement des propriétés ...)

Idéalement, vous voudrez faire des fichiers un ObservableCollection<T> au lieu d'un List<T>, aussi bien. Cela permettra à la liaison de gérer l'ajout ou la suppression d'éléments correctement.

Si vous faites ces deux choses, cela devrait fonctionner correctement.

+0

Merci. La prochaine étape [pour moi] sera d'apprendre à créer 'ObservableLis : INotifyCollectionChanged, INotifyPropertyChanged' – David

+0

Existe-t-il un moyen de ccintermettre la partie ? et comme aller 'ItemsSource =" {Binding Files.PROPERTY} ">? –

+0

@Nerdintraining Vous pouvez utiliser DisplayMemberPath si vous liez simplement une chaîne (ou quelque chose qui semble converti en une chaîne) –

2

Deux astuces pour ajouter à la réponse de Reed:

1) Si tout ce que vous affichiez dans vos éléments de la zone de liste est une chaîne, vous pouvez éviter les ListBox.ItemTemplate folderol en réglant simplement ListBox.DisplayMemberPath.

2) Vous pouvez définir le DataContext de la fenêtre sur lui-même. Par exemple, donnez à la fenêtre un nom de MyWindow et définissez ses DataContext à {Binding ElementName=MyWindow}. Vous pouvez maintenant lier à l'une de ses propriétés publiques. (Je suis assez sûr que Reed est celui à qui j'ai appris cette astuce.)

+0

Merci. C'est une approche intéressante et je vais certainement l'utiliser. – David

Questions connexes