如何为 DataTable.RowChanged 事件代码设置 DataContext

Posted

技术标签:

【中文标题】如何为 DataTable.RowChanged 事件代码设置 DataContext【英文标题】:How to set a DataContext for DataTable.RowChanged Event code 【发布时间】:2021-10-31 18:35:41 【问题描述】:

我正在尝试在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("customer0", id),
            string.Format("address0", id) );
            

            custTable.AcceptChanges();

            // change the name column in all the rows
            foreach (DataRow row in custTable.Rows)
            
                row["name"] = string.Format("vip0", 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”来创建这个项目。 请告诉我如何解决这个问题。谢谢。

【问题讨论】:

为什么使用 .NET Core 3.1 而不是较新的 .NET 5? 为什么 DataTableRowChanged 是静态方法?正如错误消息告诉您的那样,您无法从静态方法访问非静态属性 DataContext。 @Clemens 这就是答案。删除 static 解决了这个问题(......我没有注意到......)。您可以将其发布为答案吗? 【参考方案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()
    

【讨论】:

我用你的替换了我的Row_Changed(),但我仍然遇到同样的错误。 我不太明白你需要什么。我补充了我的答案。

以上是关于如何为 DataTable.RowChanged 事件代码设置 DataContext的主要内容,如果未能解决你的问题,请参考以下文章

如何为@Valid 指定验证组?

如何为下拉菜单制作 CSS 边框?

如何为 CAShapeLayer 路径和填充颜色设置动画

iPhone - 如何为图像着色?

如何为 RecyclerView 设置 onItemClickListener? [复制]

WCF - 如何为 NTLM 身份验证配置 netTcpBinding?