Поделиться контекстным меню в WP7 xaml - PullRequest
1 голос
/ 03 августа 2011

Я хочу добавить контекстное меню к элементам в списке.Обычно ответ заключается в добавлении контекстного меню в корень шаблона элемента.Тем не менее, я использую селектор шаблонов, поэтому используется несколько шаблонов, в зависимости от данных каждого элемента в списке.Это означает, что мне нужно добавить одно и то же определение contextmenu для каждого шаблона, что не очень привлекательно.

Одним из решений является завершение таблицы данных в ContentControl, что даст мне единственное место для определения контекстного меню.Тем не менее, я считаю, что это добавит накладные расходы, которые не нужны.

Другое решение, которое я попробовал, - это добавить ContextMenu в словарь ресурсов, но я полагаю, что это приводит к совместному использованию одного и того же экземпляра объекта для всех видов использования, и из-за способа реализации ContextMenu это также не работает.

Третье решение - использовать событие Loaded для вызова функции, которая соответствующим образом заполняет контекстное меню.Однако это приводит к перемещению большого количества кода, который должен быть в XAML, в код, и выглядит довольно некрасиво.Если есть какой-то способ определения контекстного меню в xaml, а затем просто ссылка на него из кода, я нахожу это привлекательным, но я не совсем понимаю, как это сделать.

Какой правильный способиспользовать одно и то же ContextMenu для всех шаблонов в селекторе шаблонов?


Это метод ContentControl, который работает, но в итоге добавляет два элемента управления содержимым к каждому элементу:

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <ContentControl>
                        <toolkit:ContextMenuService.ContextMenu>
                            <toolkit:ContextMenu Loaded="ContextMenu_Loaded">
                                <toolkit:MenuItem Header="Delete"/>
                            </toolkit:ContextMenu>
                        </toolkit:ContextMenuService.ContextMenu>
                        <ContentControl ContentTemplate="{StaticResource MyTemplate}" Content="{Binding}"/>
                    </ContentControl>
                </DataTemplate>
            </ListBox.ItemTemplate>

1 Ответ

1 голос
/ 19 августа 2011

Как насчет добавления ContextMenu в TemplateSelector?

<ListBox ItemsSource="{Binding}">
    <ListBox.Resources>
        <DataTemplate x:Key="MyTemplate">
            <StackPanel>
                <TextBlock Text="{Binding}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <local:CustomTemplateSelector Content="{Binding}">
                <toolkit:ContextMenuService.ContextMenu>
                    <toolkit:ContextMenu>
                        <toolkit:MenuItem Header="Delete"
                                            Click="MenuItem_Click" />
                    </toolkit:ContextMenu>
                </toolkit:ContextMenuService.ContextMenu>
                <local:CustomTemplateSelector.TemplateOne>
                    <DataTemplate>
                        <ContentControl Content="{Binding}"
                                        ContentTemplate="{StaticResource MyTemplate}"
                                        Foreground="Blue" />
                    </DataTemplate>
                </local:CustomTemplateSelector.TemplateOne>
                <local:CustomTemplateSelector.TemplateTwo>
                    <DataTemplate>
                        <ContentControl Content="{Binding}"
                                        ContentTemplate="{StaticResource MyTemplate}"
                                        Foreground="Red" />
                    </DataTemplate>
                </local:CustomTemplateSelector.TemplateTwo>
                <local:CustomTemplateSelector.TemplateThree>
                    <DataTemplate>
                        <ContentControl Content="{Binding}"
                                        ContentTemplate="{StaticResource MyTemplate}"
                                        Foreground="Yellow" />
                    </DataTemplate>
                </local:CustomTemplateSelector.TemplateThree>
            </local:CustomTemplateSelector>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Я запустил это, и это сработало для меня - попробуйте и дайте мне знать, был ли это эффект, который вы искали или нет.

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