2013-05-22 15 views
6

Ciao sto lavorando nell'app di Windows Store con pattern MVVM e ho qualche problema nel catturare il valore di itemviewport listview nel comando relay. Ora ho ottenuto il valore dell'oggetto selezionato.Ma non so come ottenere itemclickValue. Qui ho allegato il mio codice.Come ottenere Listview ItemClick Vallue nel comando di inoltro

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> 

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

    } 

risposta

7

C'è un po 'di ridondanza qui:

Opzione 1: risparmiare il 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(); 
      })); 
    } 

} 

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

Opzione 2: risparmiare il SelectedItem rilegatura:

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

e rimuovere la proprietà SelectedItem dal ViewModel, a meno che non ne hai bisogno per qualcos'altro.

EDIT

Se si desidera gestire l'evento click su un elemento, è necessario spostare il comportamento al controllo padre ItemTemplate DataTemplate, ad esempio, la griglia in cui sono collocati i controlli. Ciò ti consente di gestire l'evento click sull'elemento.

+0

Grazie per la vostra risposta.Ha dato la soluzione per l'evento SelectionChanged. Ma ho bisogno dell'evento ItemClick. – user1583834

+0

@ user1583834: ho modificato la mia risposta. questo aiuta? – Marc

+0

sì grazie mille. – user1583834

0

Per risolvere il problema ho valutato il setter attribuito se esiste un riferimento Null. Poi ha funzionato bene e l'evento non è stato gettato più scegliere altri elementi.

<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

Ciao kleopatra, grazie per la tua risposta e scusa per la risposta tardiva. Non ho visto l'intera struttura XAML sopra, questo è il motivo per cui ho postato il mio come risposta. Ho pensato che forse il mio approccio è sbagliato perché puoi anche definire un blocco di testo di modello di cella e aggiungere quindi eventi. Quindi ho pensato che forse ha costruito le sue cellule con questo approccio che è diverso dal mio. Quindi non ha usato la vista elenco in una vista a schede questo è il motivo per cui ottengo l'eccezione Null dopo aver cambiato la scheda. Questo non è stato descritto. Ho già risolto il problema.Le domande non erano realmente duplicate. Forse puoi cancellare il downvote. – user2644964

+0

ahh .. Capisco - grazie per il chiarimento :-) Ti preghiamo di considerare di modificare la tua risposta di nuovo e di chiarire che è davvero una soluzione. – kleopatra