Я загружаю 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?