2017-02-10 3 views
0

ListViewを含むMenuItemがあります。 What whant:リストビューアイテムをクリックすると、いくつかのコマンドが起動します。ここに私のコードは次のとおりです。ListViewアイテムのクリックイベントMVVM

<MenuItem Header="?"> 
<ListView ItemsSource="{Binding CommentTemplateList}" BorderThickness="0" SelectedItem="{Binding SelectedCommentTemplate, UpdateSourceTrigger=PropertyChanged}"> 
<i:Interaction.Triggers> 
<i:EventTrigger EventName="SelectionChanged"> 
<i:InvokeCommandAction Command="{Binding PasteTemplate}" 
CommandParameter="{Binding SelectedCommentTemplate}" /> 
</i:EventTrigger> 
</i:Interaction.Triggers> 
<ListView.View> 
<GridView> 
<GridViewColumn> 
<GridViewColumn.CellTemplate> 
<DataTemplate> 
<TextBlock Text="{Binding Caption}" ToolTip="{Binding Description}" HorizontalAlignment="Center"></TextBlock> 
</DataTemplate> 
</GridViewColumn.CellTemplate> 
</GridViewColumn> 
</GridView> 
</ListView.View> 
</ListView> 
</MenuItem> 

Everithingはokですが、コマンドPasteTemplate火災は、選択が変更された場合にのみ、それは私が項目をクリックするたびに発射に私が必要。もし私がEventNameをリスト(https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.aspx)(例えばMouseDown)から1に変更すると、コマンドはまったく起動しません。

答えて

-1

'SelectionChanged'を使用する場合は、コードの後に​​選択をリセットすることができます。それをあなたのペーストテンプレートに加えてください。

if(((ListView)sender).SelectedIndex == -1)return; 
//your code 
((ListView)sender).SelectedIndex = -1; 

したがって、コードの後、ListViewには選択された要素がありません。したがって、もう一度クリックすると、選択が再び変更され、コードが再び発生します。

注:MouseDownも使用できますが、ややこしいことです。たとえば、ユーザーがListView内の他の場所(thisなど)をクリックしていない場合は、現在の選択項目で再度発生します。

+0

MVVMを使用しているので、ListView SelectedIndexプロパティをSelectedTemplateIndex変数にバインドしました。 マイコード:XAML: 'SelectedIndexを= "{バインディングSelectedTemplateIndex}" ' ビューモデル: 'プライベートボイドOnPasteTemplateExecute(){IF(SelectedTemplateIndex == '' -1)のリターン; LeaveCommentBox = SelectedCommentTemplate.Description; '' SelectedTemplateIndex = -1; } ' と私は同じ動作を参照してください - 選択が実際に変更されている場合のみ、コマンドが発生します。 –

+0

'SelectedTemplateIndex = -1'はあなたの選択をリセットするはずです。 -1番目の要素を選択し(リストビューでは何も選択しないことを意味します)、再度選択することができます。 まだリセットされていない場合は、SelectedItemをリセットするか、[link](http:// stackoverflow。com/a/18462019/7538242) – GBursali

0

ここで示唆したようにあなたがListViewItemプレビュー MouseDownイベントを扱うことができる:

WPF MVVM Light Multiple ListBoxItems bound to same object

<ListView ...> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnMouseLeftButtonDown"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
    .. 
</ListView> 

を使用すると、コード - からのビューモデルのコマンドを起動したくない場合あなたの背後には、添付の動作で同じ機能をラップすることができます:https://www.codeproject.com/articles/28959/introduction-to-attached-behaviors-in-wpf

上記のリンクに関する情報があります。

0

これを達成するには、MVVMアーキテクチャを尊重しながら、xamlコードに以下のように特定の動作を追加することをお勧めします。

<ListView x:Name="ListView" 
          ItemsSource="{x:Bind ViewModel.SampleItems, Mode=OneWay}" 
          SelectedItem="{x:Bind ViewModel.SelectedItem, Mode=OneWay}" 
          IsItemClickEnabled="True"> 
         <i:Interaction.Behaviors> 
          <ic:EventTriggerBehavior EventName="ItemClick"> 
           <ic:InvokeCommandAction Command="{x:Bind ViewModel.ItemClickCommand}" /> 
          </ic:EventTriggerBehavior> 
         </i:Interaction.Behaviors> 

        </ListView> 

そして、次のようにあなたの後ろにコード内でイベントを処理しているかのように、あなたのビューモデルで、次のようにIComandプロパティを宣言した後、

public ICommand ItemClickCommand 
    { 
     get 
     { 
      if (_itemClickCommand == null) 
      { 
       _itemClickCommand = new RelayCommand<ItemClickEventArgs>(OnItemClick); 
      } 

      return _itemClickCommand; 
     } 
    } 

は、コマンドを定義します。

private void OnItemClick(ItemClickEventArgs args) 
{ListDataItem item = args?.ClickedItem as ListDataItem; //DO what ever you want with the Item you selected in the click} 

注:RelayCommandは、MVVMLight Frameworkを使用してコマンドを処理するために使用されます。

+0

この機能は私にとって100%役立ちます –

関連する問題