2010-04-20 75 views
7

Tôi đang học WPF, vì vậy tôi là loại n00b trong này. Tôi đã xem một số ví dụ về cách làm những gì tôi muốn làm, nhưng không có gì chính xác ...Danh sách Binding vào Danh sách (Bộ sưu tập) trong XAML

Câu hỏi: Tôi muốn ràng buộc Danh sách vào ListBox. Tôi muốn làm điều đó trong XAML, w/o mã hóa trong mã phía sau. Làm thế nào tôi có thể đạt được điều đó?

Ngay bây giờ tôi làm điều đó cách mà:

XAML

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

Mã đằng sau

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

Nhưng tôi muốn để thoát khỏi FileList.ItemsSource = files;FileList.Items.Refresh(); trong Mã C#.

Cảm ơn

+1

chủ đề này có thể giúp bạn. http://stackoverflow.com/questions/9391746/how-can-i-data-bind-a-list-of-strings-to-a-listbox-in-wpf-wp7 – FebinDonz

Trả lời

17

Thứ nhất, thiết lập các ràng buộc trong listbox của bạn:

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

hoặc

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

Tiếp theo, chắc chắn "Files" là một tài sản trong DataContext của bạn (hoặc mã ẩn). (Bạn không thể liên kết với các trường, chỉ các thuộc tính ...)

Lý tưởng nhất, bạn sẽ muốn đặt các tệp là ObservableCollection<T> thay vì List<T>. Điều này sẽ cho phép các ràng buộc để xử lý thêm hoặc loại bỏ các yếu tố một cách chính xác.

Nếu bạn làm hai việc này, nó chỉ hoạt động chính xác.

+0

Cảm ơn. Bước tiếp theo [cho tôi] sẽ học cách tạo ra 'ObservableLis : INotifyCollectionChanged, INotifyPropertyChanged' – David

+0

Có cách nào để cắt xén phần không? và thích đi 'ItemsSource =" {Binding Files.PROPERTY} ">? –

+0

@Nerdintraining Bạn có thể sử dụng DisplayMemberPath nếu bạn chỉ cần ràng buộc một chuỗi (hoặc một cái gì đó trông đúng được chuyển đổi thành một chuỗi) –

2

Hai thủ thuật để thêm vào câu trả lời của ông Reed:

1) Nếu tất cả các bạn đang hiển thị trong mục hộp danh sách của bạn là một chuỗi, bạn có thể tránh ListBox.ItemTemplate folderol bằng cách chỉ cần thiết lập ListBox.DisplayMemberPath.

2) Bạn có thể đặt cửa sổ DataContext của chính nó. Ví dụ: đặt tên cho cửa sổ là MyWindow và đặt DataContext thành {Binding ElementName=MyWindow}. Bây giờ bạn có thể liên kết với bất kỳ thuộc tính công khai nào của nó. (Tôi khá chắc chắn Reed của người mà tôi đã học được rằng lừa từ nơi đầu tiên.)

+0

Cảm ơn bạn. Đó là một cách tiếp cận thú vị và tôi chắc chắn sẽ sử dụng nó. – David

Các vấn đề liên quan