在Setter.Value结构中设置事件处理程序

时间:2011-01-20 20:34:30

标签: wpf events xaml styles setter

我有一个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来避免这种情况。但很明显,代码会从您需要的所有包装标签中充分膨胀。

我的问题是,是否有一些解决方法,因此您无需处理{{1}}。


修改:有关为何发生此错误的说明,请参阅this question

2 个答案:

答案 0 :(得分:10)

您可以将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>

答案 1 :(得分:0)

您可以ListBoxItem.HorizontalContentAlignmentStretch,然后将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>