2011-01-20 13 views
7

Mam ListView i chcę skonfigurować menu kontekstowe, które można otworzyć nie tylko po kliknięciu prawym przyciskiem myszy jakiegoś tekstu w kolumnie, ale w dowolnym miejscu na ListViewItem, do zrobienia więc pomyślałem, że właśnie ustawię mój ContextMenu za pomocą ustawnika stylu, ponieważ nie mogę uzyskać bezpośredniego dostępu do ListViewItem.Ustawianie procedur obsługi zdarzeń wewnątrz struktury Setter.Value

Niestety podczas próby zrobić to w ten sposób, że nie będzie skompilować:

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

Error 102 'Handler' nie jest poprawny. "Kliknij" nie jest zdarzeniem na "System.Windows.Controls.GridView".

Pomyślałem, że można tego uniknąć, używając EventSetter dla Click -event. Ale jest oczywiste, że kod jest dość zawyżony ze wszystkich potrzebnych znaczników zawijania.

Moje pytanie brzmi, czy istnieje pewne obejście problemu, więc nie musisz zajmować się EventSetters.


Edit: Zobacz this question o wyjaśnienie, dlaczego na występuje ten błąd.

Odpowiedz

10

można umieścić ContextMenu w ListView zasobów s, a następnie użyć go jako zasób statycznych, w ten sposób nie będziesz musiał użyć stylu dla MenuItem 's

<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

Dobry pomysł! Dzięki. –

0

Możesz po prostu ListBoxItem.HorizontalContentAlignment do Stretch, a następnie umieścić ContextMenu w swoim ListBox.ItemTemplate. Oto przykład:

<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

Obawiam się, że nie zrobię tego, ponieważ używam GridView ... –

+0

Niestety, pytanie mówi ListBox i przeoczyłem inne wskazówki, że faktycznie jest ListView. –

+0

Oh wow, masz rację, całkowicie napisał ListBox tam trzy razy, tylko nie zepsuł tego w kodzie, ponieważ jest skopiowany, przepraszam. –

Powiązane problemy