使用ObservableCollection更改Collection时,ComboBox项未更新

时间:2017-05-19 10:14:40

标签: c# .net wpf xaml combobox

我在.NET WPF应用程序中绑定的Datagrid中有ComboBox,如下所示:

<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>

因此每行都绑定到不同模型中的字段Category。 categoryViewSource定义如下

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

我的类别模型使用PropertyChanged.Fody NuGet包实现INotifyPropertyChanged。在使用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;

因此它被绑定到Observable集合。但是,一旦我做了

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

我的CollectionViewSource已更新(至少在调试器中),这似乎是合乎逻辑的,它的源是一个ObservableCollection。但即使我做了

categoryViewSource.View.Refresh();

我的ComboBox ItemsSource尚未更新。我在StackOverflow上的某个地方试过了IsSynchronizedWithCurrentItem="True"。到目前为止,只有这样做才有效:

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

但是我的SelectedItem属性在所有ComboBox中都是null,并且它们在Datagrid中显示为空,因为一旦重新分配集合,显然SelectedItem的实例是不同的。

有没有人有解决方案。不幸的是,我还是WPF的新手并且不知道。

1 个答案:

答案 0 :(得分: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 } } 。然后将任何新对象添加到上下文和数据绑定集合中,即:

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

好的,如果我直接将其添加为ItemsSource,那确实有效。但是,如果我通过单独的Binding添加集合,它就不起作用。我需要通过转换器传递集合。有没有办法自动完成?

您可以通过编程方式设置绑定:

font-family : cambria