我对MVVM应用程序中的datagrid绑定有一点问题。我实现了INotifyPropertyChanged
但它不适用于datagrid。每次我向数据库网格插入记录都不刷新,我必须重新启动应用程序才能看到更改。这是XML:
<DataGrid AutoGenerateColumns="False" x:Name="PlantsGrid" Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="8" Margin="5" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" SelectionMode="Single" IsReadOnly="True" ItemsSource="{Binding PlantsCollection}" SelectionChanged="PlantsGrid_SelectionChanged" >
<DataGrid.Columns>
<DataGridTextColumn x:Name="Nazwa" Header="Nazwa" Width="*" Binding="{Binding Name}"/>
<DataGridTextColumn x:Name="LatName" Header="Nazwa łacińska" Width="*" Binding="{Binding LatinName}" />
</DataGrid.Columns>
<DataGrid.DataContext>
<ViewModel:PlantViewModel/>
</DataGrid.DataContext>
</DataGrid>
代码隐藏:
private ObservableCollection<Plant> _plantsCollection;
public ObservableCollection<Plant> PlantsCollection
{
get
{
return _plantsCollection;
}
set
{
_plantsCollection = value;
OnPropertyChanged("PlantsCollection");
}
}
答案 0 :(得分:0)
将记录添加到数据库上下文后,还需要将其添加到viewmodel中的集合中。如果只是将记录添加到db,则不会触发属性更改事件,因为db插入不会连接到该集合。
答案 1 :(得分:0)
我很困惑,您是否将记录直接添加到数据库?
一个简单的&#34;刷新&#34;如果您尝试避免每次重新启动该应用程序以显示数据库更新,则清除本地数据并重新加载数据库数据的按钮将起作用。
但我猜你想让数据库更新进入你的应用程序
你可以谷歌,但这里没有灵丹妙药。
如果您的数据库正在应用程序范围之外进行更新,那么您必须实现一种方法来通知应用程序数据已更改。
然后解决这些更改的方法,包括做什么关于冲突。
也许这有助于您开始旅程 http://www.codeproject.com/Articles/233770/AutoRefresh-Entity-Framework-data-using-SQL-Server
答案 2 :(得分:0)
不需要以下代码: OnPropertyChanged( “PlantsCollection”);
ObservableCollection已经这样做了。
您需要从数据库重新加载或将新记录(在数据库成功之后)插入到您的集合中。
如果您使用的是MVVMLight或类似的MVVM程序包,请转到以下链接: https://github.com/ntierontime/Log4Net/blob/master/Log4Net/UI/MVVMLight/Shared/ViewModels/ViewModelLog.cs