2009-09-17 22 views
6

Với đoạn mã sau:WPF ListBox ItemsSource StaticResource/Binding câu hỏi

<Window x:Class="WpfApplication76.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:col="clr-namespace:System.Collections;assembly=mscorlib" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <CollectionViewSource x:Key="myCol"> 
      <CollectionViewSource.Source> 
       <col:ArrayList> 
        <ListBoxItem>Uno</ListBoxItem> 
        <ListBoxItem>Dos</ListBoxItem> 
        <ListBoxItem>Tres</ListBoxItem> 
       </col:ArrayList> 
      </CollectionViewSource.Source> 
     </CollectionViewSource> 
    </Window.Resources> 

    <Grid> 
     <ListBox ItemsSource="{StaticResource myCol}" /> 
     <ListBox ItemsSource="{Binding Source={StaticResource myCol}}" /> 
    </Grid> 

</Window> 

Trong ví dụ này,

<ListBox ItemsSource="{StaticResource myCol}" /> 

Cung cấp cho tôi một lỗi phàn nàn rằng nó không thể liên kết với một đối tượng "CollectionViewSource".

Nhưng ListBox khác:

<ListBox ItemsSource="{Binding Source={StaticResource myCol}}" /> 

liên kết hoàn toàn tốt đẹp.

Vì vậy, câu hỏi của tôi là tại sao một người làm việc và người kia thì không? Cuối cùng, không phải cả hai ItenSources được đặt thành cùng một đối tượng "CollectionViewSource"?

Cảm ơn bạn.

Trả lời

4

Mục ItemsSource thuộc loại IEnumerable. Một CollectionViewSource không phải là một IEnumerable. Thuộc tính ViewViewSource's View sẽ cung cấp cho bạn một IEnumerable.

Khi bạn Liên kết với một CollectionViewSource Ràng buộc đủ thông minh để lấy thuộc tính Chế độ xem và thực sự liên kết với điều đó. Có lẽ CollectionViewSource có một [DefaultBindingProperty] trên đó.

Nó tóm tắt thực tế là khi bạn đi qua Ràng buộc, bạn không thực sự liên kết với CollectionViewSource, nhưng thuộc tính Chế độ xem của nó.

+0

Cảm ơn Mike. Tôi nhận ra vấn đề là gì. Câu hỏi của tôi đã thực sự hướng nhiều hơn về phía tại sao Binding lấy sự tự do của việc chọn một tài sản từ đối tượng "CollectionViewSource" và chỉ cắn vào đó? Ý tôi là, tại sao phần mở rộng "StaticResource" không được tự do làm điều tương tự? – Rene

+2

Loại đoán, nhưng StaticResource chỉ là nói "làm cho tôi điều này", nơi Binding là nói "có được cho tôi một cái gì đó tôi có thể liên kết với". StaticResource có nhiều nghĩa đen hơn. Nó không có bối cảnh sử dụng trong khi với Binding hệ thống biết lý do tại sao bạn đang yêu cầu tài nguyên. Cuốn sách của Chris Anderson, "Essential WPF" tôi nghĩ. Mô tả thứ tự của những điều xảy ra khi một Binding không thể tìm ra chính xác những gì cần làm. Tôi không có nó tiện dụng nhưng tôi sẽ cố gắng và tìm nó lên. Nó có thể nói những gì xảy ra trong trường hợp này. –