2013-05-22 10 views
6

Witam pracuję w aplikacji sklepu Windows z wzorem MVVM i mam pewien problem w złapaniu wartości itemview listview w poleceniu relay. Teraz mam wybraną wartość pozycji. Ale nie wiem, jak zdobyć itemclickValue. Tutaj załączam mój kod.Jak zdobyć ListView ItemClick Vallue w Relay Command

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> 

Kod 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(); 
       })); 
     } 

    } 

Odpowiedz

7

Jest trochę redundancji tutaj:

Wariant 1: Części 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(); 
      })); 
    } 

} 

i 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> 

Opcja 2: Części do SelectedItem oprawa:

<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> 

i usunąć właściwość SelectedItem z ViewModel, o ile jest to potrzebne do czegoś innego.

EDIT

Jeśli chcesz obsłużyć zdarzenia kliknij na pozycji, trzeba przenieść się do kontroli zachowania dominującego ItemTemplate DataTemplate, na przykład siatkę, w której elementy sterujące są umieszczone. Umożliwi to obsługę zdarzenia kliknięcia na elemencie.

+0

Dziękuję za odpowiedź. Podano rozwiązanie dla zdarzenia SelectionChanged. Ale potrzebuję zdarzenie ItemClick. – user1583834

+0

@ user1583834: Edytowałem swoją odpowiedź. czy to pomaga? – Marc

+0

tak, dziękuję bardzo. – user1583834

0

Aby rozwiązać problem, oceniłem setera przypisanego, jeśli istnieje odniesienie zerowe. Wtedy wszystko działało dobrze i wydarzenie nie było już odrzucane, wybierz inne elementy.

<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

Cześć Kleopatra, dziękuję za odpowiedź i przepraszam za spóźnioną odpowiedź. Nie widziałem powyżej całej struktury XAML, dlatego wysłałem moją jako odpowiedź. Pomyślałem, że może moje podejście jest błędne, ponieważ możesz również zdefiniować blokowanie tekstu szablonu komórki i dodać następnie zdarzenia. Pomyśl, może zbudował swoje komórki z takim podejściem, które różni się od mojego. Następnie nie używał widoku listy w widoku karty, dlatego po przełączeniu karty otrzymuję wyjątek Null. Tego nie opisano. Już rozwiązałem problem.Pytania nie były tak naprawdę powielane. Może możesz usunąć downvote. – user2644964

+0

ahh .. Rozumiem - dziękuję za wyjaśnienie :-) Rozważ ponowne zredagowanie odpowiedzi i wyjaśnij, że to rzeczywiście rozwiązanie. – kleopatra