Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以从可观察集合中删除,但视图不更新_C#_Wpf_Datagrid_Observablecollection - Fatal编程技术网

C# 可以从可观察集合中删除,但视图不更新

C# 可以从可观察集合中删除,但视图不更新,c#,wpf,datagrid,observablecollection,C#,Wpf,Datagrid,Observablecollection,我正在研究在可观察集合中添加和删除行的能力 从最初的帖子开始,我创建了一个测试应用程序,它只能从可观察的集合中删除行。我从外部填充数据库,然后在这里打开它,只是为了测试无法运行的delete函数。它执行RemoveAt行,从可观察集合中删除,但视图不更新。以下是我的全部代码: 型号: public class TestModel : ObservableObject { #region Properties private Double id; public Double

我正在研究在可观察集合中添加和删除行的能力

从最初的帖子开始,我创建了一个测试应用程序,它只能从可观察的集合中删除行。我从外部填充数据库,然后在这里打开它,只是为了测试无法运行的delete函数。它执行RemoveAt行,从可观察集合中删除,但视图不更新。以下是我的全部代码:

型号:

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之间会有如此大的差异。但无论如何,谢谢你!