【发布时间】:2017-05-19 10:14:40
【问题描述】:
我在 .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>
所以每一行都绑定到不同模型中的字段类别。 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 没有更新。我尝试使用 IsSynchronizedWithCurrentItem="True",如 StackOverflow 上的某处所示。到目前为止,它只有在我做这样的事情时才有效:
categoryViewSource.Source = null;
categoryViewSource.Source = db.Categories.Local;
但是我的 SelectedItem 属性在所有 ComboBox 中都为空,并且它们在 Datagrid 中显示为空,因为显然 SelectedItem 的实例在您重新分配集合后是不同的。
谁有解决办法。不幸的是,我对 WPF 还是很陌生,不知道。
【问题讨论】: