2013-05-22 14 views
6

こんにちは、私はMVVMパターンでWindowsストアのアプリケーションで働いています、そして、私はrelayコマンドのlistview itemclick値をキャッチする際にいくつか問題があります。今私はitemclickValueを取得する方法を知らない選択した項目のvalue.Butを持っている。ここで私のコードを添付しています。RelayコマンドでListView ItemClickを取得する方法

XAML

<ListView x:Name="lstItem" ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding ItemList}" Padding="130,0,0,0" SelectedItem="{Binding SelectedItem,Mode=TwoWay}"> 
      <Triggers:Interactions.Triggers> 
       <Triggers:EventTrigger EventName="SelectionChanged"> 
        <Triggers:InvokeCommandAction Command="{Binding SelectedItemCommand}" CommandParameter="{Binding SelectedItem,Mode=TwoWay}"/> 
       </Triggers:EventTrigger> 
      </Triggers:Interactions.Triggers> 
     </ListView> 

のViewModelコード

private Item _selectedItem; 
    public Item SelectedItem { get { return _selectedItem; } set { _selectedItem = value; NotifyPropertyChanged("SelectedTrends"); } } 



private RelayCommand<Item> _selectedItemCommand; 
    public RelayCommand<Item> SelectedItemCommand 
    { 
     get 
     { 
      return this._selectedItemCommand 
       ?? (this._selectedItemCommand= new RelayCommand<Item>(item=> 
       { 
        MessageDialog messagedialog = new MessageDialog(item.Name,"Test"); 
        messagedialog.ShowAsync(); 
       })); 
     } 

    } 

答えて

7

冗長性のビットがここにあります:

オプション1:CommandParameterスペア:

private Item _selectedItem; 
public Item SelectedItem 
{ 
    get { return _selectedItem; } 
    set { _selectedItem = value; NotifyPropertyChanged("SelectedTrends"); } 
} 



private RelayCommand _selectedItemCommand; 
public RelayCommand SelectedItemCommand 
{ 
    get 
    { 
     return this._selectedItemCommand 
      ?? (this._selectedItemCommand= new RelayCommand(() => 
      { 
       MessageDialog messagedialog = new MessageDialog(selectedItem.Name,"Test"); 
       messagedialog.ShowAsync(); 
      })); 
    } 

} 
は、 210

およびXAML:

<ListView x:Name="lstItem" ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding ItemList}" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" Padding="130,0,0,0"> 
    <Triggers:Interactions.Triggers> 
     <Triggers:EventTrigger EventName="SelectionChanged"> 
      <Triggers:InvokeCommandAction Command="{Binding SelectedItemCommand}" /> 
     </Triggers:EventTrigger> 
    </Triggers:Interactions.Triggers> 
</ListView> 

オプション2:結合のSelectedItemスペア:

<ListView x:Name="lstItem" ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding ItemList}" Padding="130,0,0,0"> 
    <Triggers:Interactions.Triggers> 
     <Triggers:EventTrigger EventName="SelectionChanged"> 
      <Triggers:InvokeCommandAction Command="{Binding SelectedItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=lstItem}"/> 
     </Triggers:EventTrigger> 
    </Triggers:Interactions.Triggers> 
</ListView> 

、あなたが何か他のもののためにそれを必要としない限り、ViewModelにからSelectedItemプロパティを削除します。

EDIT

アイテムにクリックイベントを処理したい場合は、例えば、ItemTemplateのDataTemplateの親コントロールにコントロールが配置されているグリッドを振る舞いを移動する必要があります。これにより、アイテムのクリックイベントを処理できます。

+0

ご回答ありがとうございます。ここでは、SelectionChangedイベントの解決策をご提供しました。しかし、私はItemClickイベントが必要です。 – user1583834

+0

@ user1583834:私は自分の答えを編集しました。これは役に立ちますか? – Marc

+0

ありがとうございます。 – user1583834

0

Null参照がある場合、問題を解決するために、セッターの属性を評価しました。その後、それは正常に動作し、イベントはもうスローされなかった他の要素を選択します。

<ListView Name="lstView" ItemsSource="{Binding Path=SimResults}" > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <i:InvokeCommandAction Command="{Binding SelectedItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=lstView}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Center"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.View> 
     <GridView> 
      <GridView.Columns> 
       <GridViewColumn Header="FileUniqueID" Width="Auto" DisplayMemberBinding="{Binding Path=FileUniqueID}" /> 
       <GridViewColumn Header="XML" Width="Auto" DisplayMemberBinding="{Binding Path=XML}" /> 
       <GridViewColumn Header="Request" Width="Auto" HeaderStringFormat="" DisplayMemberBinding="{Binding Path=RequestShort}" /> 
       <GridViewColumn Header="RequestDate" Width="Auto" DisplayMemberBinding="{Binding Path=RequestDate}" /> 
       <GridViewColumn Header="Response" Width="Auto" DisplayMemberBinding="{Binding Path=ResponseShort}" /> 
       <GridViewColumn Header="ResponseDate" Width="Auto" DisplayMemberBinding="{Binding Path=ResponseDate}" /> 
       <GridViewColumn Header="ResendCounter" Width="Auto" DisplayMemberBinding="{Binding Path=ResendCounter}" /> 
      </GridView.Columns> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

こんにちはkleopatra、あなたの返信に感謝し、遅い応答にごめんなさい。私は上記のXAML構造全体を見たことがなかったので、これは私が答えとして投稿した理由です。私はあなたのセルテンプレートのテキストブロックを定義してイベントを追加することもできるので、私のアプローチが間違っているかもしれないと考えました。だから、おそらく彼は私のものとは違うこのアプローチで自分の細胞を構築するだろうと思った。それから彼はタブビューでリストビューを使用しなかったので、これはタブを切り替えた後にNull例外を取得する理由です。これは記述されていませんでした。私はすでに問題を解決しました。質問は本当に重複していませんでした。たぶんあなたはdownvoteを削除することができます。 – user2644964

+0

ahh ..わかりました - 明確化のおかげで:-)あなたの答えをもう一度編集し、それが確かに解決策であることを明確にしてください。 – kleopatra

関連する問題