2017-05-19 41 views
1

我在,我在.NET WPF應用程序綁定一個DataGrid有組合框。所述categoryViewSource定義如下使用PropertyChanged.Fody NuGet包組合框項目時集合改變使用的ObservableCollection

<CollectionViewSource x:Key="categoryViewSource" d:DesignSource="{d:DesignInstance {x:Type Models:Category}, CreateList=True}"/> 

我的類別模型實現INotifyPropertyChanged。我加載使用實體框架數據庫中的數據後,我分配數據到CollectionViewSource如下:

var db = new MyDbContext(); 
System.Windows.Data.CollectionViewSource categoryViewSource = (System.Windows.Data.CollectionViewSource)this.Resources["categoryViewSource"]; 
await db.Categories.LoadAsync(); 
categoryViewSource.Source = db.Categories.Local; 

因此它必然要觀察集合。但是,一旦我做

var c = new Category { Name="New Category" }; 
db.Categories.Add(c); 

我CollectionViewSource是(至少在調試器)更新,這似乎是合乎邏輯的,它的來源是一個ObservableCollection。但即使我做

categoryViewSource.View.Refresh(); 

我的組合框ItemsSource不更新。我試着用IsSynchronizedWithCurrentItem="True"在StackOverflow上看到的地方。到目前爲止,它僅適用,如果我做這樣的事情:

categoryViewSource.Source = null; 
categoryViewSource.Source = db.Categories.Local; 

但後來我的SelectedItem屬性是所有組合框爲空,它們顯示在DataGrid空的,因爲的SelectedItem的明顯的情況下,一旦你重新分配集合不同。

有沒有人有解決方案。不幸的是,我對WPF仍然很陌生,不知道。

回答

1

將新的Category添加到DbSet<Category>不會影響ObservableCollection<Category>。這是兩個不同的獨立內存集合。您將不得不將相同的對象添加到兩個集合。

您可以創建一個ObservableCollection,並與當你初始化你ComboBox你的實體對象來填充這一個。然後你添加任何新的對象到這兩個背景下,爲了您的數據綁定的集合,即:

public partial class MainWindow : Window 
{ 
    ObservableCollection<Category> _cats; 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var db = new MyDbContext(); 
     System.Windows.Data.CollectionViewSource categoryViewSource = (System.Windows.Data.CollectionViewSource)this.Resources["categoryViewSource"]; 
     await db.Categories.LoadAsync(); 
     _cats = new ObservableCollection<Category>(db.Categories.Local); 
     categoryViewSource.Source = _cats; 
     //... 
     var c = new Category { Name = "New Category" }; 
     db.Categories.Add(c); //add to DbSet 
     _cats.Add(c); //add to ObservableCollection 
    } 
} 

好吧,如果我直接將其添加爲ItemsSource時,那確實工作。但是,如果我通過單獨的綁定添加集合,它不起作用。我需要通過轉換器傳遞集合。有沒有辦法自動做到這一點?

你可以設置程序的結合:

categoryValues.SetBinding(ComboBox.ItemsSourceProperty, new Binding(".") { Source = _cats, Converter = new CategoriesToCategoriesConverter() }); 
+0

我試了一下,並沒有奏效。 事情是,'ObservableCollection '確實得到更新。我的'db.Categories.Local'是'ObservableCollection ',它會更新,'CollectionViewSource.Source'只是一個參考,對不對?無論如何,如果我在'db.Categories.Add(c)'之後進行調試,我的categoryViewSource確實會在其View.InternalList中顯示一個新項目。 我在Converter中爲ItemsSource放置了一個斷點,看看是否有東西,但是轉換器永遠不會觸發,所以不知何故綁定到categoryViewSource不起作用? – LeoReentry

+1

db.Categories與ObservableCollection不是同一個集合。如果將ComboBox的ItemsSource屬性直接設置爲ObservableCollection:categoryValues.ItemsSource = _cats; – mm8

+0

好吧,如果我直接將它作爲ItemsSource添加,那確實有效。但是,如果我通過單獨的綁定添加集合,它不起作用。我需要通過轉換器傳遞集合。有沒有辦法自動做到這一點? – LeoReentry