Установка обработчиков событий внутри структуры Setter.Value - PullRequest
7 голосов
/ 20 января 2011

У меня есть ListView, и я хотел бы настроить контекстное меню, которое я могу открыть не только при щелчке правой кнопкой мыши по тексту в некотором столбце, но и в любом месте на ListViewItem, для этого я подумал, что ' я просто установил ContextMenu с помощью установщика стилей, так как я не могу напрямую получить доступ к ListViewItem.

К сожалению, когда вы попытаетесь сделать это так, он не скомпилируется:

<Style TargetType="ListViewItem">
    <Setter Property="ContextMenu">
        <Setter.Value>
            <ContextMenu>
                <MenuItem Header="Header" Click="Handler"/>
                ...
            </ContextMenu>
        </Setter.Value>
    </Setter>
</Style>

Ошибка 102 «Обработчик» недействителен. «Нажмите» не событие на 'System.Windows.Controls.GridView'.

Я подумал, что вы можете избежать этого, используя EventSetter для Click события. Но очевидно, что код становится достаточно раздутым от всех необходимых вам тегов-оберток.

У меня вопрос: есть ли обходной путь, чтобы вам не приходилось иметь дело с EventSetters.


Редактировать: См. этот вопрос для объяснения , почему возникает эта ошибка.

Ответы [ 2 ]

10 голосов
/ 21 января 2011

Вы можете поместить ContextMenu в ресурсы ListView, а затем использовать его в качестве статического ресурса, чтобы вам не пришлось использовать стиль для MenuItem

.
<ListView ...>
    <ListView.Resources>
        <ContextMenu x:Key="listViewContextMenu">
            <MenuItem Header="Header" Click="MenuItem_Click"/>
        </ContextMenu>
    </ListView.Resources>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="ContextMenu" Value="{StaticResource listViewContextMenu}"/>
        </Style>
    </ListView.ItemContainerStyle>
    <!--...-->
</ListView>
0 голосов
/ 21 января 2011

Вы можете просто ListBoxItem.HorizontalContentAlignment до Stretch и затем поставить ContextMenu в свой ListBox.ItemTemplate.Вот пример:

<Grid>
    <Grid.Resources>
        <PointCollection x:Key="sampleData">
            <Point X="10" Y="20"/>
            <Point X="30" Y="40"/>
        </PointCollection>
    </Grid.Resources>
    <ListBox Width="100" ItemsSource="{StaticResource sampleData}">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Background="Red">
                    <Grid.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Test" Click="MenuItem_Click"/>
                        </ContextMenu>
                    </Grid.ContextMenu>
                    <TextBlock Text="{Binding}"/>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
...