2017-05-19 2 views
1

を使用して変更したときに、私は次のように私は、.NET WPFアプリケーションにバインドするDataGrid内のComboBoxを持っている:コンボボックスのアイテムコレクションのObservableCollection

<ComboBox x:Name="categoryValues" MinWidth="70" 
      IsSynchronizedWithCurrentItem="False"     
      SelectedValuePath="Id" 
      ItemsSource="{Binding Source={StaticResource categoryViewSource}, 
       Converter={StaticResource CategoriesToCategoriesConverter}}" 
      SelectedItem="{Binding Category, 
       Mode=TwoWay, 
       UpdateSourceTrigger=PropertyChanged, 
       Converter={StaticResource CategoryToCategoryConverter}}" 
      DisplayMemberPath="Name" SelectionChanged="categoryValues_SelectionChanged"> 
</ComboBox> 

だから、各行が異なるモデルで、フィールドカテゴリにバインドされています。

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

マイカテゴリーモデルがPropertyChanged.Fody NuGetパッケージを使用してINotifyPropertyChangedの実装を次のようにcategoryViewSourceが定義されています。私は、Entity Frameworkのを使用してデータベースからデータをロードした後、私は次のように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; 

だから、それが監視可能なコレクションにバインドされています。しかし、かつて私は、私のCollectionViewSourceは、論理思われる、(少なくともデバッガに)更新され

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

がそう、それはソースがあるのObservableCollectionです。しかし、私がしても

categoryViewSource.View.Refresh(); 

私のComboBox ItemsSourceは更新されません。私はIsSynchronizedWithCurrentItem="True"とStackOverflowのどこかで見てみました。

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

しかし、その後、私のSelectedItemプロパティは、すべてのコンボボックスにnullで、コレクションを再割り当て後に明らかにのSelectedItemのインスタンスが異なっているので、彼らはDataGrid内空表示されます。私はこのような何かを行う場合はこれまでのところそれだけで、動作します。

誰にも解決策がありますか?残念なことに、私はまだWPFの新機能ではありません。

答えて

1

DbSet<Category>に新しいCategoryを追加しても、ObservableCollection<Category>には影響しません。これらは、2つの異なるインメモリコレクションです。両方のコレクションに同じオブジェクトを追加する必要があります。

を作成し、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 
    } 
} 

[OK]を、私は直接作業を行うのItemsSource、としてそれを追加した場合。しかし、別のBindingを使ってコレクションを追加すると、コレクションは機能しません。私はコンバータを介してコレクションを渡す必要があります。それを自動的に行う方法はありますか?

あなたはプログラムでバインディングを設定できます。

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'に新しい項目を表示します。 ItemsSourceのConverterにブレークポイントを設定して何かがあるかどうかを確認しますが、Converterは決して起動しません。なぜなら、何らかの理由でcategoryViewSourceへのバインディングが機能しないのですか? – LeoReentry

+1

db.CategoriesはObservableCollectionと同じコレクションではありません。 ComboBoxのItemsSourceプロパティをObservableCollectionに直接設定するとどうなりますか?categoryValues.ItemsSource = _cats; – mm8

+0

これをItemsSourceとして直接追加しても問題ありません。しかし、別のBindingを使ってコレクションを追加すると、コレクションは機能しません。私はコンバータを介してコレクションを渡す必要があります。それを自動的に行う方法はありますか? – LeoReentry

関連する問題