我不懂 C#,我正在从例子中、从我的错误和失败中慢慢学习。))。我观察其他人是如何做的,并将代码片段应用到我的项目中。今天我制作了一个应用程序(使用 MVVM),其窗口分为两部分,左侧部分(侧边栏)有一个菜单,右侧部分有来自不同用户控件的内容。将 SQLite 数据库与 EF 连接并迁移到项目。数据输入到数据库并显示在 DataGrid 中。但卡在删除上,或者更确切地说,卡在删除已删除行的显示上。那些。在数据库中,该行已被删除,但 DataGrid 并未发生改变。我将尽我所能描述现在的情况:有一个带有 DataGrid 的 UserControl,并且显示的每行都有一个按钮。以下是 Reports.xaml 文件的 View 文件夹中的一些代码
<UserControl x:Class= ...>
<UserControl.DataContext>
<vm:ReportsVM/>
</UserControl.DataContext> ...
...
<DataGrid x:Name="ReportsDataGrid"
ItemsSource = "{Binding Source={x:Static vm:ReportsVM.reportsView}}"
SelectedCellsChanged="NO_SelectedCellsChanged"> ....
...
<Button Name="BtnReportRemove"
Content="Удалить отчет"
Tag="{Binding id_report}"
CommandParameter="{Binding Path=Tag, RelativeSource={RelativeSource Self}}"
Command="{Binding Path=DataContext.DeleteReportCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
...
我从数据库中获取DataGrid的数据,有这样一个类:
public static List<ReportModel> GetAllReports()
{
using (var db = new ContextModel())
{
return db.dbReportTable.OrderBy(b => b.id_report).ToList();
}
}
并将它们放入一个集合中,在 ViewModel 中有以下代码:
private ObservableCollection<ReportModel> reports;
public ObservableCollection<ReportModel> Reports
{
get { return reports; }
set { Set(ref reports, value); }
}
public static CollectionViewSource reportsView = new CollectionViewSource();
...
...
public ReportsVM()
{
DeleteReportCommand = new LambdaCommand(OnDeleteReportExecuted, CanDeleteReportExecute);
Reports = new ObservableCollection<ReportModel>(ReportData.GetAllReports());
reportsView = new CollectionViewSource();
reportsView.Source = Reports;
}
由于我将 id_report 链接到按钮Tag="{Binding id_report}"
,因此在 ViewModel 命令中我从数据库中删除了具有给定 id_report 的行。删除 ViewModel 中的命令代码
// Команда удаления строки из БД и DataGrid
public ICommand DeleteReportCommand { get; set; }
private bool CanDeleteReportExecute(object p) => true;
private void OnDeleteReportExecuted(object p)
{
int cnv1;
cnv1 = Convert.ToInt32(p);
MessageBoxResult result = MessageBox.Show("Вы действительно хотите удалить Отчет?", "Удаление", MessageBoxButton.YesNo, MessageBoxImage.Question);
if ( result == MessageBoxResult.No) return;
using (ContextModel db = new ContextModel())
{
var orderInDb = db.dbReportTable.First(x => x.id_report == cnv1);
db.dbReportTable.Remove(orderInDb);
db.SaveChanges();
}
var collection = reports;
var item = collection.Where(X => X.id_report == cnv1).FirstOrDefault();
int index = collection.IndexOf(item);
reports.RemoveAt(index);
//Reports.Clear();
//Reports = new ObservableCollection<ReportModel>(ReportData.GetAllReports());
//((ObservableCollection<ReportModel>)reportsView.Source).Clear();
}
我尝试执行注释中的行,但没有任何效果。那些。该行从数据库中删除,该行从集合中删除(断点显示集合中没有具有选定索引的行),但 DataGrid 中没有任何变化,如果我仅从这个 UserControl 移动到另一个 UserControl 然后返回,则变化是可见的。我认为这里有一些基本而简单的东西,我已经尝试了第三天来寻找它)模型中的数据模型
public class ReportModel
{
[Key]
public int id_report { get; set; }
public string? name_report { get; set; }
public string? date_report { get; set; }
}