如何为 DataTable.RowChanged 事件代码设置 DataContext
How to set a DataContext for DataTable.RowChanged Event code
我正在尝试 运行 DataTable.RowChanged Event 中的代码,但我无法设置 DataContext
,这给了我这样的错误:
CS0120 An object reference is required
for the non-static field, method, or property 'FrameworkElement.DataContext'
代码如下:
MainWindow.xaml.cs
using System;
using System.Data;
using System.Windows;
namespace DataTable_RowChanged
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataTableRowChanged();
}
private static 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);
// add ten rows
//for (int id = 1; id <= 10; id++)
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"]);
}
// The line below causes the error:
// CS0120 An object reference is required
// for the non-static field, method, or property 'FrameworkElement.DataContext'
DataContext = custTable;
}
private static void Row_Changed(object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("Row_Changed Event: name={0}; action={1}",
e.Row["name"], e.Action);
}
}
}
MainWindow.xaml.cs
<Window x:Class="DataTable_RowChanged.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DataTable_RowChanged"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<DataGrid ItemsSource="{Binding}"/>
</Grid>
</Window>
我尝试的是改变这一行:
for (int id = 1; id <= 10; id++)
到这一行:
for (int id = 0; id < 10; id++)
...因为我在address
之后看到了一个额外的空项。
这并没有解决问题。
我选择了“WPF Application .NET Core 3.1”来创建这个项目。
请告诉我如何解决这个问题。谢谢。
您需要将 sender 转换为 FrameworkElement 类型。
private static void Row_Changed(object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("Row_Changed Event: name={0}; action={1}",
e.Row["name"], e.Action);
if(sender is FrameworkElement fe)
{
Console.WriteLine($"DataContext: {fe.DataContext}");
}
}
我不明白您想通过哪种方法获取该行的 DataContext。
或者你需要 Window.DataContext?
在这种情况下,DataTableRowChanged 方法必须是实例方法。
private /* static */ void DataTableRowChanged()
{
我正在尝试 运行 DataTable.RowChanged Event 中的代码,但我无法设置 DataContext
,这给了我这样的错误:
CS0120 An object reference is required
for the non-static field, method, or property 'FrameworkElement.DataContext'
代码如下:
MainWindow.xaml.cs
using System;
using System.Data;
using System.Windows;
namespace DataTable_RowChanged
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataTableRowChanged();
}
private static 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);
// add ten rows
//for (int id = 1; id <= 10; id++)
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"]);
}
// The line below causes the error:
// CS0120 An object reference is required
// for the non-static field, method, or property 'FrameworkElement.DataContext'
DataContext = custTable;
}
private static void Row_Changed(object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("Row_Changed Event: name={0}; action={1}",
e.Row["name"], e.Action);
}
}
}
MainWindow.xaml.cs
<Window x:Class="DataTable_RowChanged.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DataTable_RowChanged"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<DataGrid ItemsSource="{Binding}"/>
</Grid>
</Window>
我尝试的是改变这一行:
for (int id = 1; id <= 10; id++)
到这一行:
for (int id = 0; id < 10; id++)
...因为我在address
之后看到了一个额外的空项。
这并没有解决问题。
我选择了“WPF Application .NET Core 3.1”来创建这个项目。 请告诉我如何解决这个问题。谢谢。
您需要将 sender 转换为 FrameworkElement 类型。
private static void Row_Changed(object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("Row_Changed Event: name={0}; action={1}",
e.Row["name"], e.Action);
if(sender is FrameworkElement fe)
{
Console.WriteLine($"DataContext: {fe.DataContext}");
}
}
我不明白您想通过哪种方法获取该行的 DataContext。
或者你需要 Window.DataContext?
在这种情况下,DataTableRowChanged 方法必须是实例方法。
private /* static */ void DataTableRowChanged()
{