C# 可以从可观察集合中删除,但视图不更新
我正在研究在可观察集合中添加和删除行的能力 从最初的帖子开始,我创建了一个测试应用程序,它只能从可观察的集合中删除行。我从外部填充数据库,然后在这里打开它,只是为了测试无法运行的delete函数。它执行RemoveAt行,从可观察集合中删除,但视图不更新。以下是我的全部代码: 型号:C# 可以从可观察集合中删除,但视图不更新,c#,wpf,datagrid,observablecollection,C#,Wpf,Datagrid,Observablecollection,我正在研究在可观察集合中添加和删除行的能力 从最初的帖子开始,我创建了一个测试应用程序,它只能从可观察的集合中删除行。我从外部填充数据库,然后在这里打开它,只是为了测试无法运行的delete函数。它执行RemoveAt行,从可观察集合中删除,但视图不更新。以下是我的全部代码: 型号: public class TestModel : ObservableObject { #region Properties private Double id; public Double
public class TestModel : ObservableObject
{
#region Properties
private Double id;
public Double ID
{
get { return id; }
set
{
id = value;
RaisePropertyChangedEvent("ID");
}
}
private string type;
public string Type
{
get { return type; }
set
{
type = value;
RaisePropertyChangedEvent("Type");
}
}
private decimal amount;
public decimal Amount
{
get { return amount; }
set
{
amount = value;
RaisePropertyChangedEvent("Amount");
}
}
private string notes;
public string Notes
{
get { return notes; }
set
{
notes = value;
RaisePropertyChangedEvent("Notes");
}
}
#endregion
}
视图模型:
public class MainWindowViewModel : ObservableObject
{
#region GetData
public MainWindowViewModel()
{
Transactions = DatabaseFunctions.getTransactionData();
}
#endregion
#region ObservableCollections
private ObservableCollection<TestModel> transactions;
public ObservableCollection<TestModel> Transactions
{
get { return transactions; }
set
{
transactions = value;
RaisePropertyChangedEvent("Transactions");
}
}
#endregion
#region Properties
public static string SharedWith;
private Double id;
public Double ID
{
get { return id; }
set
{
id = value;
RaisePropertyChangedEvent("ID");
}
}
private string type;
public string Type
{
get { return type; }
set
{
type = value;
RaisePropertyChangedEvent("Type");
}
}
private decimal amount;
public decimal Amount
{
get { return amount; }
set
{
amount = value;
RaisePropertyChangedEvent("Amount");
}
}
private string notes;
public string Notes
{
get { return notes; }
set
{
notes = value;
RaisePropertyChangedEvent("Notes");
}
}
#endregion
public void DeleteTransactionRow(List<TestModel> SelectedTransaction, int SelectedIndex)
{
Transactions.RemoveAt(SelectedIndex);
}
public类MainWindowViewModel:ObserveObject
{
#区域获取数据
公共主窗口视图模型()
{
事务=DatabaseFunctions.getTransactionData();
}
#端区
#区域可观测集合
私人可观测收款交易;
公开可观察的收集交易
{
获取{返回事务;}
设置
{
交易=价值;
RaisePropertyChangedEvent(“交易”);
}
}
#端区
#区域属性
与共享的公共静态字符串;
私人双身份证;
公共双ID
{
获取{return id;}
设置
{
id=值;
RaisePropertyChangedEvent(“ID”);
}
}
私有字符串类型;
公共字符串类型
{
获取{返回类型;}
设置
{
类型=值;
RaisePropertyChangedEvent(“类型”);
}
}
私人十进制金额;
公共小数金额
{
获取{返回金额;}
设置
{
金额=价值;
增加财产变动(“金额”);
}
}
私人弦乐;
公共弦乐
{
获取{返回注释;}
设置
{
注释=价值;
提高产权变更(“注释”);
}
}
#端区
public void DeleteTransactionRow(列出SelectedTransaction,int SelectedIndex)
{
Transactions.removet(SelectedIndex);
}
视图:
处理delete命令并将所需信息传递给视图模型的代码隐藏:
public partial class MainWindow : Window
{
MainWindowViewModel mainwindowviewmodel = new MainWindowViewModel();
public MainWindow()
{
InitializeComponent();
}
private void DeleteTransactionRow_Click(object sender, RoutedEventArgs e)
{
List<TestModel> selectedtransaction = TransactionsDataGrid.SelectedItems.Cast<TestModel>().ToList();
mainwindowviewmodel.DeleteTransactionRow(selectedtransaction, TransactionsDataGrid.SelectedIndex);
}
private void MouseRightButtonUpHandler(object sender, RoutedEventArgs e)
{
this.TransactionsDataGrid.SelectedItem = ((DataCell)sender).ParentRow.DataContext;
}
}
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
}
公共部分类主窗口:窗口
{
MainWindowViewModel MainWindowViewModel=新的MainWindowViewModel();
公共主窗口()
{
初始化组件();
}
私有void DeleteTransactionRow_单击(对象发送方,路由目标)
{
列出selectedtransaction=TransactionsDataGrid.SelectedItems.Cast().ToList();
mainwindowviewmodel.DeleteTransactionRow(selectedtransaction、TransactionDataGrid.SelectedIndex);
}
私有void MouseRightButtonUpHandler(对象发送器,RoutedEventTargets e)
{
this.TransactionsDataGrid.SelectedItem=((数据单元)发送方).ParentRow.DataContext;
}
}
因此,希望有人能看到RemoveAt为什么不更新视图。您需要将
主窗口的DataContext
设置为您的视图模型:
public partial class MainWindow : Window
{
MainWindowViewModel mainwindowviewmodel = new MainWindowViewModel();
public MainWindow()
{
InitializeComponent();
}
private void DeleteTransactionRow_Click(object sender, RoutedEventArgs e)
{
List<TestModel> selectedtransaction = TransactionsDataGrid.SelectedItems.Cast<TestModel>().ToList();
mainwindowviewmodel.DeleteTransactionRow(selectedtransaction, TransactionsDataGrid.SelectedIndex);
}
private void MouseRightButtonUpHandler(object sender, RoutedEventArgs e)
{
this.TransactionsDataGrid.SelectedItem = ((DataCell)sender).ParentRow.DataContext;
}
}
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
}
我还建议您研究将点击事件绑定到视图模型中的命令,而不是依赖于隐藏的代码。您可以发布Add
方法代码吗?我已经添加了将行添加到可观察集合的方法。您可以发布视图模型和XAML的相关部分吗?很难提出任何建议您发布到目前为止的代码上没有任何错误。好的,谢谢您迄今为止的帮助。我相信我已经添加了所有相关代码。您的datagrid被称为“TestDataGrid”,但您使用的是“datagrid.SelectedIndex”,然后是itemcollection.RemoveAt(grid.SelectedIndex)的原因是什么;-它的名字是什么?它起作用了!我真是太感谢你了。我正在努力将所有点击事件绑定到viewmodel;有一些事情会抛出奇怪的错误,但通过这项工作,我可以继续这些错误。我只是不明白为什么在代码隐藏中设置datacontext与XAML之间会有如此大的差异。但无论如何,谢谢你!