2010-04-20 20 views
7

Uczę się WPF, więc jestem w tym rodzaju n00b. Widziałem kilka przykładów, jak zrobić to, co chcę, ale nic dokładnie ...Powiązanie ListBox do listy (kolekcja) w XAML

Pytanie: Chcę powiązać listę z ListBox. Chcę to zrobić w XAML, bez kodowania z kodem. Jak mogę to osiągnąć?

Teraz robię to ten sposób:

XAML

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

kod za

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

Ale chcę się pozbyć FileList.ItemsSource = files; i FileList.Items.Refresh(); w Kod C#.

Dzięki

+1

ten wątek może ci pomóc. http://stackoverflow.com/questions/9391746/how-can-i-data-bind-a-list-of--list--list-in-wpf-wp7 – FebinDonz

Odpowiedz

17

pierwsze, konfiguracja wiązanie w polu listy:

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

lub

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

Następnie upewnij się, "Pliki" to nieruchomość w DataContext (lub kod z tyłu). (Nie można powiązać z polami, tylko właściwości ...)

Najlepiej byłoby, gdyby pliki miały postać ObservableCollection<T> zamiast List<T>. Umożliwi to powiązanie obsługę poprawnego dodawania lub usuwania elementów.

Jeśli zrobisz te dwie rzeczy, powinna po prostu działać poprawnie.

+0

Dzięki. Następnym krokiem [dla mnie] będzie nauczenie się tworzenia "ObservableLis : INotifyCollectionChanged, INotifyPropertyChanged' – David

+0

Czy istnieje sposób na ccutowanie części ? i lubię wchodzić w "ItemsSource =" {Binding Files.PROPERTY} ">? –

+0

@Nerdintraining Możesz użyć DisplayMemberPath, jeśli po prostu wiążisz ciąg (lub coś, co wygląda poprawnie konwertowane na ciąg) –

2

Dwie sztuczki, aby dodać do odpowiedzi Reeda:

1) Jeśli wszystko masz w swoim wyświetlania elementów skrzynkowych lista jest ciągiem znaków, można uniknąć ListBox.ItemTemplate folderol tylko przez ustawienie ListBox.DisplayMemberPath.

2) Możesz ustawić dla siebie okno DataContext. Na przykład nadaj mu nazwę MyWindow i ustaw jej DataContext na {Binding ElementName=MyWindow}. Teraz możesz powiązać dowolną z jego właściwości publicznych. (Jestem prawie pewien, że Reed, od którego nauczyłem się tej sztuczki).

+0

Dziękuję. To ciekawe podejście i na pewno z niego skorzystam. – David

Powiązane problemy