SelectedItemChanged событие для настраиваемого элемента управления TreeView WPF - PullRequest
0 голосов
/ 18 июня 2020

C#, WPF. Я создал подкласс элемента управления TreeView и не могу заставить работать событие SelectedItemChanged. Я не вижу, что я делаю иначе, чем в таких примерах, как this и this .

Код будет выполняться, но на 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 не меняет поведения.

1 Ответ

0 голосов
/ 20 июня 2020

Проблема была вызвана тем, что обработчик событий был помещен в неправильный класс. Спасибо A Sh, который указал на это в комментарии. Для других это рабочий код:

<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");
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...