2010-06-09 47 views
10

我有一個簡單的視圖模型,如:XAML綁定到CollectionViewSource財產上的視圖模型

public class MainViewModel { 
    ObservableCollection<Project> _projects; 
    public MainViewModel() { 
     // Fill _projects from DB here... 
     ProjectList.Source = _projects; 
     ProjectList.Filter = ...; 
    } 

    public CollectionViewSource ProjectList { get; set; } 
} 

我設置窗口的DataContext到視圖模型在構造函數中的一個新實例:

public MainWindow() { 
    this.DataContext = new MainViewModel(); 
} 

然後在Xaml中,我試圖將ListBox的ItemsSource綁定到該ProjectList屬性。

綁定的ItemsSource只是像這樣不起作用:

<ListBox ItemsSource="{Binding ProjectList}" ItemTemplate="..." /> 

但是,如果我第一次重訂DataContext的工作的:

<ListBox DataContext="{Binding ProjectList}" ItemsSource="{Binding}" ItemTemplate="..." /> 

應該不是第一種方法可以正常工作?我可能會做錯什麼?

+0

你是從數據庫同步還是異步獲取數據? – Timores 2010-06-09 20:03:46

+0

同步,除了如果它是一種競爭條件,然後第二種方法也不會工作... – joshperry 2010-06-09 20:11:16

回答

16

如果您使用的是CollectionViewSource,則需要將ItemsSourceProjectList.View綁定,而不是ProjectList。這應該可以解決你的問題。

+0

所以我想我不能重複我的問題,或者...我更新了什麼ViewModel「真的「 好像。 – joshperry 2010-06-09 23:10:22

+0

查看我的更新回答。我不完全確定爲什麼CollectionViewSource以這種方式工作,但它的方式我一直不得不與他們合作。 – 2010-06-09 23:59:11

+3

謝謝,這非常有幫助。這是我第一次使用CollectionViewSource。我最終使屬性類型'ICollectionView'和getter我從私人CollectionViewSource返回'View'屬性。這樣我就不必擔心綁定到'.View',如果我將來改變ViewModel屬性的集合類型,它將會中斷。 – joshperry 2010-06-10 16:52:07

0

從你提供的第一種方法應該完美的工作。細節中,魔鬼潛伏在某處。

PS:也許你沒有指定實現INotifyPropertyChanged接口爲了郵政大小的緣故,但要小心生產。如果你沒有實現,很容易得到memory leak

+0

是的,它實際上實現了該接口。如果你願意,可以稱它爲測試用例。 – joshperry 2010-06-09 23:12:46