Контекстное меню на дочернем элементе, чтобы также показать родительское контекстное меню - PullRequest
0 голосов
/ 26 июня 2019

У меня есть родительская сетка "address" с двумя дочерними сетками "address": Origin и Destination.В зависимости от контекста обе дочерние сетки могут отображаться одновременно, либо только одна из них, либо ни одной.Я хотел бы добавить контекстные меню, чтобы включить копирование отображаемых адресов в буфер обмена.При щелчке правой кнопкой мыши по адресу origin должно отображаться меню «Копировать адрес источника», а при щелчке правой кнопкой мыши по адресу destination должно отображаться меню «Копировать адрес назначения», но я также хотел бы разрешить пользователюскопируйте оба адреса одновременно, поэтому при нажатии на любой адрес также должно появиться дополнительное меню «Копировать оба адреса».

Моей первой попыткой было добавление контекстного меню «Копировать оба адреса» в основную сетку, а затемотдельно добавив «Копировать адрес x» в каждую дочернюю сетку, например так:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Copy both addresses" />
        </ContextMenu>
    </Grid.ContextMenu>

    <!-- Origin -->
    <Grid Grid.Row="0">
        <Grid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Copy origin addresses" />
            </ContextMenu>
        </Grid.ContextMenu>
        <TextBlock Text="Origin" />
    </Grid>

    <!-- Destination -->
    <Grid Grid.Row="1">
        <Grid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Copy destination addresses" />
            </ContextMenu>
        </Grid.ContextMenu>
        <TextBlock Text="Destination" />
    </Grid>
</Grid>

Я думал, что контекстное меню дочерних элементов будет добавлено (объединено) в родительское контекстное меню и покажет оба,Я был неправ.Кажется, что контекстные меню на дочерних элементах перезаписывают любые контекстные меню на родительском элементе.

Поэтому я попробовал более ручной и сложный метод добавления CompositeCollection из MenuItem s к каждой дочерней сетке с обоими текущимикопировать меню и копировать оба меню, вот так:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <!-- Origin -->
    <Grid Grid.Row="0">
        <Grid.ContextMenu>
            <ContextMenu>
                <ContextMenu.ItemsSource>
                    <CompositeCollection>
                        <MenuItem Header="Copy origin addresses" />
                        <MenuItem Header="Copy both addresses" />
                    </CompositeCollection>
                </ContextMenu.ItemsSource>
            </ContextMenu>
        </Grid.ContextMenu>
        <TextBlock Text="Origin" />
    </Grid>

    <!-- Destination -->
    <Grid Grid.Row="1">
        <Grid.ContextMenu>
            <ContextMenu>
                <ContextMenu.ItemsSource>
                    <CompositeCollection>
                        <MenuItem Header="Copy destination addresses" />
                        <MenuItem Header="Copy both addresses" />
                    </CompositeCollection>
                </ContextMenu.ItemsSource>
            </ContextMenu>
        </Grid.ContextMenu>
        <TextBlock Text="Destination" />
    </Grid>
</Grid>

Но проблема здесь в том, что, как уже говорилось, не всегда отображаются оба адреса, в таком случае я бы не хотел показывать«Копировать оба адреса» вообще.

Как мне это сделать (используя шаблон MVVM)?

...