Использование событий / команд с XamlReader - PullRequest
3 голосов
/ 20 августа 2010

Я динамически создаю табличку с данными, используя XamlReader.Parse (string).У меня проблема в том, что я не могу помещать события ни в один из элементов управления, созданных с помощью XamlReader.Проведя некоторые исследования в Интернете, я узнал, что это известное ограничение XamlReader.

Я не знаю много о командах в WPF, но могу ли я как-то использовать их для получения того же результата?Если так, то как?Если нет, то есть ли способ обработать событие в моем коде позади элемента управления, созданного с помощью Xaml Reader?

Ниже приведен пример созданной мной таблицы данных.У меня есть обработчик события MenuItem_Click, определенный в коде позади окна, в котором будет размещена эта таблица данных.

При попытке его запустить появляется следующая ошибка: System.Windows.Markup.XamlParseException не обработан: не удалось создать «щелчок» из текста «MenuItem_Click».

DataTemplate result = null;
        StringBuilder sb = new StringBuilder();

        sb.Append(@"<DataTemplate 
                        xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
                        xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
                            <Grid Width=""Auto"" Height=""Auto"">

                            <TextBlock Text=""Hello"">
                                <TextBlock.ContextMenu>
                                    <ContextMenu>
                                         <MenuItem 
                                          Header=""World""
                                          Click=""MenuItem_Click""></MenuItem>
                                    </ContextMenu>
                                </TextBlock.ContextMenu>
                            </TextBlock>

                            </Grid>
                      </DataTemplate>");

        result = XamlReader.Parse(sb.ToString()) as DataTemplate;

Ответы [ 2 ]

5 голосов
/ 09 февраля 2012

Надежда на поздний ответ может помочь другим:

Я обнаружил, что мне нужно связать события после анализа , и мне пришлось удалить событие click из строки Xaml.

В моем сценарии я применил полученный DataTemplate к ItemTemplate, подключил ItemSource, а затем добавил обработчик. Это означает, что событие click будет одинаковым для всех элементов , но в моем случае заголовок содержал необходимую информацию, а метод был тем же.

//Set the datatemplate to the result of the xaml parsing.
myListView.ItemTemplate = (DataTemplate)result;

//Add the itemtemplate first, otherwise there will be a visual child error
myListView.ItemsSource = this.ItemsSource; 

//Attach click event.
myListView.AddHandler(MenuItem.ClickEvent, new RoutedEventHandler(MenuItem_Click));

И затем событие click должно вернуться к исходному источнику , в моем случае отправителем будет ListView, который использовал DataTemplate.

internal void MenuItem_Click(object sender, RoutedEventArgs e){
    MenuItem mi = e.OriginalSource as MenuItem;
    //At this point you can access the menuitem's header or other information as needed.
}
0 голосов
/ 20 августа 2010

Взгляните на эту ссылку .Большинство решений там также будут применяться с Parse.На самом деле я не являюсь разработчиком C #, поэтому могу объяснить только один последний вариант, который является опцией if-all-else-fails:

Сначала вы добавляете идентификаторы в свой XAML.вместо атрибутов Click и т. д.Затем вы можете использовать FindLogicalNode , чтобы получить доступ к узлам, а затем самостоятельно связать события.

Например, допустим, вы указали свой MenuItem ID="WorldMenuItem".Затем в вашем коде после вызова parse вы можете сделать это:

MenuItem worldMenuItem = (MenuItem)LogicalTreeHelper.FindLogicalNode(result, "WorldMenuItem");
worldMenuItem.Click += MenuItem_Click; // whatever your handler is
...