我在.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的新手并且不知道。
答案 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