2010-04-20 19 views
7

WPF'yi öğreniyorum, bu yüzden de bunda n00b var. Ne yapmak istediğimi yapmakla ilgili bazı örnekler gördüm, ancak hiçbir şey tam olarak değil ...XAML'deki Listeyi Listeye Bağlama (Koleksiyon)

Sorun: List ListBox'a bağlamak istiyorum. XAML'de, kodun arkasında kod yazarak yapmak istiyorum. Bunu nasıl başarabilirim?

XAML

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

Kod

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

arkasında Ama içinde FileList.ItemsSource = files; ve FileList.Items.Refresh(); kurtulmak istiyorum:

Şu anda bu bu şekilde do C# kodu.

Teşekkür

+1

bu konu size yardımcı olabilir. http://stackoverflow.com/questions/9391746/how-can-i-data-bind-a-list-of-strings-to-a-listbox-in-wpf-wp7 – FebinDonz

cevap

17

Öncelikle kurulum liste kutusunda bağlayıcı: (

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

veya

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

Sonraki emin "Files" yapmak bir mülkiyet sizin DataContext'i veya arkasındaki kod). (Sadece alanlara bağlayamazsınız, sadece özellikler ...)

İdeal olarak, Dosyaları bir List<T> yerine ObservableCollection<T> yapmak isteyeceksiniz. Bu, bağlamanın öğelerin doğru şekilde eklenmesi veya çıkarılması işlemine izin verir.

Bu iki şeyi yaparsanız, yalnızca doğru şekilde çalışması gerekir. Reed'in cevap eklemek için

+0

Teşekkürler. Sonraki adım [benim için] 'ObservableLis : INotifyCollectionChanged, INotifyPropertyChanged' – David

+0

'un nasıl oluşturulacağını öğrenecek bölümünü kesip çıkarmanın bir yolu var mı? ve ItemsSource = "{Binding Files.PROPERTY}"> gibi mi? –

+0

@Nerdintraining Yalnızca bir dizeyi (veya bir dizeye doğru görünen bir şeyi) bağlarsanız DisplayMemberPath'i kullanabilirsiniz. –

2

İki hileler: Eğer liste kutusu öğeleri görüntülediğiniz tüm bir dize ise

1), sadece ListBox.DisplayMemberPath ayarlayarak ListBox.ItemTemplate folderol önleyebilirsiniz.

2) Pencerenin DataContext ayarını kendiniz ayarlayabilirsiniz. Örneğin, pencereye MyWindow adını verin ve DataContext değerini {Binding ElementName=MyWindow} olarak ayarlayın. Artık tüm kamu özelliklerine bağlayabilirsiniz. (Eminim ki, bu hileyi ilk etapta öğrenen Reed'in olduğuna eminim.)

+0

Teşekkür ederiz. Bu ilginç bir yaklaşım ve kesinlikle onu kullanacağım. – David

İlgili konular