Списки WPF и контекстные меню

Какой элемент управления WPF позволяет перечислять элементы и контекстные меню для каждого из элементов? До сих пор я использовал ListBox, но кажется, что нет простого способа добавить контекстные меню к его элементам. Вместо этого я собираюсь изменить ListBox на другой элемент управления, который разрешает контекстные меню.

Единственные свойства/методы ListBox, которые я сейчас использую, это «SelectedIndex» и «SelectedItem». Пока предлагаемый элемент управления поддерживает это или имеет другую замену, все будет в порядке.


person rafale    schedule 12.08.2011    source источник
comment
Вы можете опубликовать свой XAML? ListBoxItem имеет свойство ContextMenu, поэтому должно работать нормально   -  person kenwarner    schedule 12.08.2011
comment
@qntmfred: см. сообщение Мелеака о XAML, который я использую. Мой предыдущий код, вероятно, не был реализован должным образом.   -  person rafale    schedule 13.08.2011


Ответы (3)


Чтобы добавить ContextMenu к ListBoxItem, вы используете ItemContainerStyle

<ListBox ItemsSource="{Binding ...}">
    <ListBox.Resources>
        <ContextMenu x:Key="listBoxItemContextMenu">
            <MenuItem Header="{Binding YourProperty}" />
        </ContextMenu>
    </ListBox.Resources>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="ContextMenu"
                    Value="{StaticResource listBoxItemContextMenu}"/>
        </Style>
    </ListBox.ItemContainerStyle>
    <!--...-->
</ListBox>
person Fredrik Hedblad    schedule 12.08.2011

Вы можете использовать элемент управления DataGrid в wpf для листинга. Также вы можете добавить contextMenu, например

<DataGrid AutoGenerateColumns="False" Height="200"  Width="200" >
        <DataGrid.ContextMenu>
        <ContextMenu >
            <MenuItem Header="Menu Header" Click="MenuItem_Click"  />
        </ContextMenu>
        </DataGrid.ContextMenu>
</DataGrid>

Также см. Создание контекстных меню для строк сетки данных

person Shebin    schedule 12.08.2011

В этом примере не используются какие-либо привязки или DataTemplates, которые вы обычно видите в реальном приложении, но, надеюсь, это поможет.

    <ListBox>
        <ListBox.Items>
            <ListBoxItem Content="Item A">
                <ListBoxItem.ContextMenu>
                    <ContextMenu>Delete A</ContextMenu>
                </ListBoxItem.ContextMenu>
            </ListBoxItem>
            <ListBoxItem Content="Item B">
                <ListBoxItem.ContextMenu>
                    <ContextMenu>Delete B</ContextMenu>
                </ListBoxItem.ContextMenu>
            </ListBoxItem>
            <ListBoxItem Content="Item C">
                <ListBoxItem.ContextMenu>
                    <ContextMenu>Delete A</ContextMenu>
                </ListBoxItem.ContextMenu>
            </ListBoxItem>
        </ListBox.Items>
    </ListBox>
person kenwarner    schedule 12.08.2011
comment
Поэтому в моем приложении мне пришлось бы программно добавлять эти контекстные меню к каждому элементу в списке, одно за другим. Разве нет лучшего способа обойти это? Возможно, помимо ListBox есть еще один элемент управления? - person rafale; 12.08.2011