首页 > 解决方案 > WPF 自定义 TreeView 控件的 SelectedItemChanged 事件

问题描述

C#,WPF。我对 TreeView 控件进行了子类化,无法使SelectedItemChanged事件正常工作。我看不出我在做什么与thisthis等示例不同。

代码将运行,但InitializeComponent()出现以下错误:

ArgumentException:无法绑定到目标方法,因为它的签名或安全透明度与委托类型的不兼容。

这个最小的项目演示了这个问题:

<Window x:Class="TEST.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:custom="clr-namespace:TEST"
  mc:Ignorable="d"
  Title="MainWindow" Height="450" Width="800">
  <Grid>
    <custom:CustomTreeView x:Name ="treeViewConfig2" 
      SelectedItemChanged="TreeViewControl_SelectedItemChanged" />
  </Grid>
</Window>

namespace TEST
{
    /// <summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //CustomTreeView tree = new CustomTreeView();
        }
    }

    public class CustomTreeView : TreeView
    {
        public CustomTreeView() { } // default constructor

        private void TreeViewControl_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<Object> e)
        {
            // Do something
        }
    }
}

我想知道这是否与<object SelectedItemChanged="RoutedPropertyChangedEventHandler"/>Microsoft 文档中提到的内容有关,但我不知道我将在哪里/如何实现它,并且在其他示例中没有看到任何等效的东西。

举办活动public不会改变行为。

标签: c#wpfxamltreeview

解决方案


问题只是由于将事件处理程序放在错误的类中引起的。感谢 ASh 在评论中指出了这一点。为了他人的利益,这是工作代码:

<Window x:Class="TEST.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:custom="clr-namespace:TEST"
  mc:Ignorable="d"
  Title="MainWindow" Height="450" Width="800">
  <Grid>
    <custom:CustomTreeView x:Name ="treeViewConfig2" 
      SelectedItemChanged="TreeViewControl_SelectedItemChanged" />
  </Grid>
</Window>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        CustomTreeView tree = new CustomTreeView();
    }
    private void TreeViewControl_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<Object> e)
    {
        MessageBox.Show((string)e.NewValue + " was selected");
    }
}

public class CustomTreeView : TreeView
{
    public CustomTreeView() {
        Items.Add("Item 1");
        Items.Add("Item 2");
    }

}

推荐阅读