2016-10-14 1 views
3

ListViewをグループ化してセットアップしましたが、MVVMのグループを右クリックするとGroupNameを取得したいと思います。グループのスタイルにContextMenuを配置し、System.Windows.InteractivityのEventToCommandを使用して基になるアイテムを取得しようとしていました。ListViewでGroupNameを取得するWPFでグループ化する

ここに関連部分:

<ListView.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.ContainerStyle> 
      <Style TargetType="{x:Type GroupItem}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate> 
          <Expander IsExpanded="False" Template="{StaticResource CustomizedExpander}" Background="#FFEBEBEB" BorderThickness="0" ContextMenu="{StaticResource GroupContextMenu}"> 
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="MouseRightButtonDown"> 
             <i:InvokeCommandAction Command="{Binding Path=OnCategorySelected}" CommandParameter="{Binding Name}"/> 
            </i:EventTrigger> 
           </i:Interaction.Triggers> 

           <Expander.Header> 
            <StackPanel Orientation="Horizontal"> 
             <!--N.B. The "Name" property is part of the CollectionViewSource--> 
             <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="#FF767676" VerticalAlignment="Bottom" /> 
             <TextBlock Text="{Binding ItemCount}" Foreground="#FF454545" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" /> 
             <TextBlock Text=" item(s)" Foreground="#FF767676" FontStyle="Italic" VerticalAlignment="Bottom" /> 
            </StackPanel> 
           </Expander.Header> 
           <ItemsPresenter /> 
          </Expander> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </GroupStyle.ContainerStyle> 
    </GroupStyle> 
</ListView.GroupStyle> 

それはそれを行うには正しい方法ですが、コマンドがまったくトリガされないようであれば、私にはわかりません。

提案がありますか?

更新:

すべてのことは私が思ったよりはるかに簡単でした。相互作用部分は全く必要ではなかった。コンテキストメニューが表示されたときにバインディングを固定する基礎となるカテゴリを取得するのに十分である:すべての

<ListView ItemsSource="{Binding Modifications}" SelectedItem="{Binding SelectedItem}"> 
    <ListView.Resources> 
     <ContextMenu x:Key="ItemContextMenu"> 
      <MenuItem Header="Execute" Command="{Binding Path=DataContext.OnExecuteScript, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}" Background="WhiteSmoke" Visibility="{Binding CanExecute, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
      <MenuItem Header="Execute up to this" Command="{Binding Path=DataContext.OnExecuteScriptUpToThis, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}" Background="WhiteSmoke" Visibility="{Binding CanOnlyBeExecutedSequentially, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
      <MenuItem Header="Drop" Command="{Binding Path=DataContext.OnExecuteDrop, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}" Visibility="{Binding Drop, Converter={StaticResource BooleanToVisibilityConverter}}" Background="WhiteSmoke" /> 
      <MenuItem Header="Dump" Command="{Binding Path=DataContext.OnExecuteDump, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}" Visibility="{Binding CanDump, Converter={StaticResource BooleanToVisibilityConverter}}" Background="WhiteSmoke" /> 
     </ContextMenu> 
     <ContextMenu x:Key="GroupContextMenu"> 
      <MenuItem Header="Dump all" Command="{Binding Path=DataContext.OnExecuteDumpAll, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}" CommandParameter="{Binding Name}" Background="WhiteSmoke" /> 
     </ContextMenu> 
    </ListView.Resources> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Type" Width="120" DisplayMemberBinding="{Binding Type}" /> 
      <GridViewColumn Header="Object Name" Width="Auto" DisplayMemberBinding="{Binding DisplayName}" /> 
      <GridViewColumn Header="" Width="50"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding Deploy}" IsHitTestVisible="False" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Object Name" Width="300" DisplayMemberBinding="{Binding ObjectName}" /> 
     </GridView> 
    </ListView.View> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource MetroListViewItem}" > 
      <Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Drop}" Value="True"> 
        <Setter Property="Foreground" Value="Red" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.GroupStyle> 
     <GroupStyle> 
      <GroupStyle.ContainerStyle> 
       <Style TargetType="{x:Type GroupItem}"> 
        <Setter Property="ContextMenu" Value="{StaticResource GroupContextMenu}" /> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Expander IsExpanded="False" Template="{StaticResource CustomizedExpander}" Background="#FFEBEBEB" BorderThickness="0"> 
            <Expander.Header> 
             <StackPanel Orientation="Horizontal"> 
              <!--N.B. The "Name" property is part of the CollectionViewSource--> 
              <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="#FF767676" VerticalAlignment="Bottom" /> 
              <TextBlock Text="{Binding ItemCount}" Foreground="#FF454545" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" /> 
              <TextBlock Text=" item(s)" Foreground="#FF767676" FontStyle="Italic" VerticalAlignment="Bottom" /> 
             </StackPanel> 
            </Expander.Header> 
            <ItemsPresenter /> 
           </Expander> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </GroupStyle.ContainerStyle> 
     </GroupStyle> 
    </ListView.GroupStyle> 
</ListView> 
+1

私が知っている限り、スタイルでブレンド動作を使用することはできません。しかし、おそらくこの回避策を使用することができます: [スタイル設定ツールでブレンド動作を追加する方法](http://stackoverflow.com/questions/1647815/how-to-add-a-blend-behavior-in-a-スタイル設定ツール) – Gabsch

+0

私はあなたのリンクで解決策を試しましたが、うまくいかないようです..選択したグループにアクセスしようとする別の方法は分かりますか? – dna2

+0

イベントとして 'PreviewMouseRightButtonDown'を試してみることもできます。 'ContextMenu'と' MouseRightButtonDown'イベントをバインドしました。 ContextMenuが最初に呼び出され、 'e.Handled'を設定すると、他のイベントは決して呼び出されません。たぶんこれはうまくいくでしょう。 – WPFGermany

答えて

1

まず、私はなぜあなたのコマンドありえないの焼成を考え出したと思います。

テンプレート内にあるため、DataContextが変更されています。したがって、あなたのいるCommandBindingは、次のようになります。また

<i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.OnCategorySelected}" CommandParameter="{Binding}"/> 

あなたが唯一の全体オブジェクトの代わりに最後に文字列を取得しますので、あなたのCommandParameterはNameすべきではありません。

上記のコードを使用すると、代わりにCollectionViewGroupが表示されます。上記のCollectionViewGroupには、グループ内のすべてのアイテムがあります。 Groupnameだけを取得しても問題がなければ、もちろん実装を進めることができます。

ContextMenuを使用している理由(そのコードを掲載していないため)は本当にわかりませんが、このようなContextMenuでグループ化されたアイテムを表示する方法に興味がある場合は、これは:

<Expander IsExpanded="False" Background="#FFEBEBEB" BorderThickness="0" > 
      <Expander.ContextMenu> 
        <ContextMenu ItemsSource="{Binding Items}"/> 
      </Expander.ContextMenu> 
</Expander> 

私たちが今知っているので、我々は(それはまだCollectionViewGroupだ)に対処しなければならないものを、私たちはのContextMenuののItemsSourceとしての項目を設定することができます。

希望すると便利です。

+0

これはチャームのように機能します!問題は拘束力がありました。私はマイナーな問題は、カテゴリがListViewバインディング中に作成されたとき、私はカテゴリを右クリックしていなくても、コマンドが呼び出されます。あなたはそれについて何か提案していますか? – dna2

+0

ちょうどあなたの答えに注意してください:名前はオブジェクトのタイプであり、それはグループの作成(私の場合は列挙型)で使用されているものと同じタイプを反映します – dna2

+0

解決済み!この問題はCommandParameter = "{Binding}"にありました。 "名前"だけをバインドすると問題が消えました!私はあなたに賞金を授与しようとしていますが、SOは5時間待たなければならないと言います... – dna2

関連する問題