如何解决DataTable.RowChanged事件中设置DataContext触发的CS0120错误
错误原因
CS0120报错的核心是访问权限问题:DataTableRowChanged方法被声明为静态方法(带static修饰符),而DataContext是MainWindow窗口类的实例属性,静态方法运行时不关联任何类实例,因此无法直接访问实例属性。
修复步骤
仅需要移除DataTableRowChanged方法的static修饰符即可解决编译报错,修改后的方法声明如下:
private void DataTableRowChanged()
如果后续需要在Row_Changed事件回调中操作当前窗口的界面元素,也可以同步移除该方法的static修饰符,无相关需求的话可以保留,不影响运行。
修复后完整代码(MainWindow.xaml.cs)
using System; using System.Data; using System.Windows; namespace DataTable_RowChanged { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataTableRowChanged(); } // 移除了static修饰符 private void DataTableRowChanged() { DataTable custTable = new DataTable("Customers"); // add columns custTable.Columns.Add("id", typeof(int)); custTable.Columns.Add("name", typeof(string)); custTable.Columns.Add("address", typeof(string)); // set PrimaryKey custTable.Columns["id"].Unique = true; custTable.PrimaryKey = new DataColumn[] { custTable.Columns["id"] }; // add a RowChanged event handler for the table. custTable.RowChanged += new DataRowChangeEventHandler(Row_Changed); for (int id = 0; id < 10; id++) { custTable.Rows.Add( new object[] { id, string.Format("customer{0}", id), string.Format("address{0}", id) }); } custTable.AcceptChanges(); // change the name column in all the rows foreach (DataRow row in custTable.Rows) { row["name"] = string.Format("vip{0}", row["id"]); } // 此处可正常访问实例属性DataContext DataContext = custTable; } // 无界面操作需求可保留static,有需求则移除 private static void Row_Changed(object sender, DataRowChangeEventArgs e) { Console.WriteLine("Row_Changed Event: name={0}; action={1}", e.Row["name"], e.Action); } } }
修改完成后重新编译运行,DataTable数据会正常绑定到界面的DataGrid控件,RowChanged事件也会按预期触发输出日志。
内容的提问来源于stack exchange,提问作者IanHacker
相关产品推荐
相关产品推荐

