如何将数据传递到 RoutedEventHandler 函数

How to pass data into a RoutedEventHandler function

我正在开发一个使用 WPF 的 C# 应用程序,目前希望在 TreeViewItem 对象获得焦点时触发一个事件。我已经使用以下代码以非常基本的方式实现了这一点:

分配事件:

TreeViewItem chr = new TreeViewItem();
chr.GotFocus += new RoutedEventHandler(testing);

实际处理人:

private void testing(object o, RoutedEventArgs e)
{
     MessageBox.Show("TESTING");             
}

这很简单,但我还希望能够在事件处理程序方法中使用对象中的数据。类似这样的事情:

TreeViewItem chr = new TreeViewItem();
chr.GotFocus += new RoutedEventHandler(testing(chr));

我不太明白该怎么做,我做的任何事情都会导致语法错误。这通常是如何完成的/甚至可能吗?

感谢任何帮助。

    private void SomeFunction()
    {
        TreeViewItem chr = new TreeViewItem();
        chr.GotFocus += testing; // Event directly, no wrapper.
    }

    private void testing(object sender, RoutedEventArgs e) // it's RoutedEventArgs, not EventArgs 
    {
        var chr = sender as TreeViewItem; // convert to item
        //do your rest work
    }

您应该使用 SelectedItemChanged 事件。检查下一个示例:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        tree.SelectedItemChanged += Tree_SelectedItemChanged;

    }

    private void Tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        MessageBox.Show(((TreeViewItem)e.NewValue).Header.ToString());
    }
}

该方法将在 "NewValue" 属性 的 e 参数中接收 TreeViewItem,因此 MessageBox 将显示项目标签。

使用 sender 参数,如下所示:

private void testing(object o, EventArgs e)
{
     var treeViewItem = o as TreeViewItem;          
}

碰巧发件人对象实际上是触发事件的对象,对于您的情况是 TreeViewItem