2010-04-20 20 views
7

Ich lerne WPF, also bin ich irgendwie n00b in diesem. Ich sah einige Beispiele darüber, wie ich das tun soll, aber nichts genau ...ListenBox an Liste (Sammlung) in XAML binden

Die Frage: Ich möchte List an ListBox binden. Ich möchte es in XAML tun, ohne Code in Code hinter. Wie kann ich das erreichen?

Im Moment mache ich es auf diese Weise:

XAML

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

-Code hinter

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(); 
} 

Aber ich will loswerden FileList.ItemsSource = files; und FileList.Items.Refresh(); in C# -Code.

Dank

+1

dieser Thread kann Ihnen helfen. http://stackoverflow.com/questions/9391746/how-can-i-data-bind-a-list-of-strings-to-a-listbox-in-wpf-wp7 – FebinDonz

Antwort

17

Zuerst Setup in Ihrer listbox die Bindung:

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

oder

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

Als nächstes stellen Sie sicher, "Files" ist ein Eigenschaft in Ihrem Datacontext (oder Code dahinter). (Sie können nicht an Felder binden, nur Eigenschaften ...)

Idealerweise möchten Sie Dateien auch eine ObservableCollection<T> anstelle einer List<T> machen. Dadurch kann die Bindung die Elemente korrekt hinzufügen oder entfernen.

Wenn Sie diese beiden Dinge tun, sollte es nur richtig funktionieren.

+0

Danke. Der nächste Schritt [für mich] wird lernen, wie man 'ObservableLis : INotifyCollectionChanged, INotifyPropertyChanged' erstellt – David

+0

Gibt es eine Möglichkeit, den Teil zu entfernen? und wie geht es 'ItemsSource =" {Binding Files.PROPERTY} ">? –

+0

@Nerdtraining Sie können DisplayMemberPath verwenden, wenn Sie nur eine Zeichenfolge binden (oder etwas, das richtig in eine Zeichenfolge konvertiert aussieht) –

2

Zwei Tricks Reed Antwort hinzuzufügen:

1) Wenn alles, was Sie Anzeigen in der Liste Feldelement ist eine Zeichenkette, können Sie vermeiden, dass der ListBox.ItemTemplate folderol nur durch Einstellung ListBox.DisplayMemberPath.

2) Sie können die DataContext des Fensters auf sich selbst einstellen. Geben Sie dem Fenster beispielsweise den Namen MyWindow, und legen Sie DataContext auf {Binding ElementName=MyWindow} fest. Jetzt können Sie eine Bindung an eine seiner öffentlichen Eigenschaften herstellen. (Ich bin mir ziemlich sicher, Reed ist, wer ich gelernt, dass Trick von an erster Stelle.)

+0

Vielen Dank. Es ist ein interessanter Ansatz und ich werde ihn sicherlich verwenden. – David

Verwandte Themen