2011-01-20 25 views
7

我有一個ListView,我想設置一個上下文菜單,我不僅可以打開右鍵單擊一些列中的某些文本,但可以打開ListViewItem上的任何文本所以我想我只是使用一個風格設置我的ContextMenu,因爲我不能直接訪問ListViewItem在Setter.Value結構中設置事件處理程序

不幸的是,當你嘗試做這樣它不會編譯:

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

錯誤102「處理程序」是無效的。 '點擊'不是 'System.Windows.Controls.GridView'上的事件。

我想你可以通過EventSetterClick -event來避免這種情況。但很明顯,代碼會從你需要的所有包裝標籤中獲得相當高的價值。

我的問題是如果有一些解決方法,所以你不必處理EventSetters


編輯:一個解釋見this question爲什麼這個錯誤發生。

回答

10

你可以把ContextMenuListView的資源,然後把它作爲一個靜態資源,這樣你就不必使用樣式爲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

您可以只需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> 
+0

恐怕不會這樣做,因爲我正在使用GridView ... – 2011-01-20 21:07:53

+0

對不起,問題是ListBox和我忽略了其他提示,它實際上是一個ListView。 – 2011-01-20 21:55:12

相關問題