WPF Добавить обработчик событий в DataTemplate в GridView - PullRequest
0 голосов
/ 04 марта 2020

Я загружаю DataTemplate динамически, используя XamlReader.Load, который не поддерживает присоединение обработчиков событий. Я проконсультировался с XamlReader с Click Event , чтобы найти альтернативу, но мне трудно получить тот же результат, потому что он не может найти имя моей кнопки. Я думаю, это потому, что у него нет фиксированного имени, поскольку DataTemplate используется для заполнения GridView в ListView.

Вот код, упрощенный для понимания:

private static string GetButtonColumnDefinition()
    {
        return @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
                    xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">

                    <ContentControl Content=""{Binding}"">
                        <ContentControl.Resources>
                            <DataTemplate DataType=""{x:Type v:NewDataItemPlaceholder}"">
                                <Button Name=""btnDataAddLine"" Content=""Add"" Click=""AddDataLine""/>
                            </DataTemplate>
                            ...
                        </ContentControl.Resources>
                    </ContentControl>
                </DataTemplate>";
    }

public static DataTemplate GenerateButtonColumnTemplate()
    {
        StringReader stringReader = new StringReader(GetButtonColumnDefinition());
        XmlReader xmlReader = XmlReader.Create(stringReader);
        DataTemplate template = (DataTemplate)XamlReader.Load(xmlReader);

        return template;
    }

private void AddButtonColumnToView(GridView view, ListView listView)
    {
        var btnColumn = new GridViewColumn() { CellTemplate = GenerateButtonColumnTemplate() };
        view.Columns.Add(btnColumn);

        // Assign event handler
        Button btn = (Button)listView.FindName("btnDataAddLine");
        btn.Click += AddDataLine;
    }

Если я пытаюсь сгенерировать шаблон без назначения обработчика событий вручную, я получаю следующую ошибку, которая совпадает с тем, что упоминалось в другом вопросе, который я связал ранее:

Система. Windows .Markup. XamlParseException: '' Не удалось создать 'Click' из текста 'AddDataLine'. ' Номер строки '8' и позиция строки '126'. '

InnerException: ArgumentException: Невозможно привязать к целевому методу, поскольку его подпись или прозрачность безопасности не совместимы с таковой для типа делегата.

Если я попытаюсь назначить обработчик событий вручную (используя FindName и еще много чего), btn будет нулевым (поэтому я предполагаю, что имя "btnDataAddLine" не может быть найдено).

Как мне назначить обработчик события для кнопки моего DataTemplate?

...