0

In meiner UWP-App, die MVVMLight verwendet, habe ich eine Schaltfläche in meinem ListViewItem enthalten und wenn ich geklickt habe, möchte ich ein Flyout anzeigen und zusätzliche Aktionen für die spezifische ListViewItem aber wenn ich auf die Schaltfläche tippen, ich erhalte eine Fehlermeldung dhCapture-Tap-Ereignis von Button in ListViewItem ohne Auslöser Element klick - UWP Windows 10

System.InvalidCastException: Unable to cast object of 
type 'Windows.UI.Xaml.Input.TappedRoutedEventArgs' to 
type 'MyApp.ViewModels.ItemViewModel'. 
at GalaSoft.MvvmLight.Command.RelayCommand`1.Execute(Object parameter) 
at Microsoft.Xaml.Interactions.Core.InvokeCommandAction.Execute(Object 
sender, Object parameter) at 
Microsoft.Xaml.Interactivity.Interaction.ExecuteActions(Object sender, 
ActionCollection actions, Object parameter) 
at Microsoft.Xaml.Interactions.Core.EventTr 

ich einige verstehen erweitern, warum es passiert ist, aber, wie ich kann ich dieses Problem beheben? Die Schaltfläche, die in meiner ListViewItem-Datenvorlage enthalten ist, wird offensichtlich an das übergeordnete Element übergeben, bei dem es sich um die Listenansicht handelt, und der DataTrigger, der in der Listenansicht definiert ist, erfasst sie.

Alles, was ich tun möchte, ist ein Flyout anzuzeigen, wenn diese Schaltfläche angeklickt wird, um zusätzliche Optionen zur Verfügung zu stellen.

<ListView.ItemTemplate> 
    <DataTemplate> 
     <Grid Background="{StaticResource SystemControlBackgroundAccentBrush5}"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 
      <Border Grid.Row="0" 
        Grid.Column="0" 
        Grid.RowSpan="4" 
        Width="90" 
        Height="90" 
        VerticalAlignment="Center" 
        Margin="5,5,0,5"> 
       <Image Width="90" 
        Height="90" 
        Source="{Binding Logo}" /> 
      </Border> 
      <Grid Grid.Row="0" Grid.Column="1" Margin="5"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="*"/> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 
       <StackPanel Orientation="Horizontal" 
         Grid.Row="1" VerticalAlignment="Bottom"> 
        <TextBlock Text="Id:" FontWeight="SemiBold" Foreground="White" VerticalAlignment="Center"/> 
        <TextBlock Text="{Binding Subject}" Margin="10,0,0,0" Foreground="White" VerticalAlignment="Center"/> 
       </StackPanel> 
       <Button Width="30" Height="30" 
         Command="{Binding AdditionalInfoCommand}" 
         Grid.RowSpan="4" 
         Grid.Column="1" 
         Margin="0,0,12,0"> 
        <Button.Template> 
         <ControlTemplate TargetType="Button"> 
          <Grid> 
           <Ellipse Stroke="{ThemeResource SystemControlBackgroundAccentBrush}" 
             Fill="{ThemeResource SystemControlBackgroundAccentBrush}" 
             StrokeThickness="2"> 
           </Ellipse> 
           <Image Source="ms-appx:///Assets/Information.png" Width="30" Height="30" /> 
          </Grid> 
         </ControlTemplate> 
        </Button.Template> 
       </Button> 
      </Grid> 
     </Grid> 
    </DataTemplate> 
</ListView.ItemTemplate> 

und meine Listview hat den folgenden Code:

<ListView ItemsSource="{Binding MyList}" 
       SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
       SelectionMode="Single"> 
     <ListView.ItemTemplate> 
      .... as defined above 
     </ListView.ItemTemplate> 
    <interactivity:Interaction.Behaviors> 
     <core:EventTriggerBehavior EventName="Tapped"> 
     <core:InvokeCommandAction Command="{Binding ItemClickCommand}" 
     CommandParameter="{Binding SelectedItem}" /> 
     </core:EventTriggerBehavior> 
    </interactivity:Interaction.Behaviors> 
</ListView> 

Alle Ideen, wie ich dieses Problem lösen kann?

UPDATE 1: schwach

Ich werde meine Frage erneut Ausdruck. Es ist mir gelungen, den im ListViewItem angezeigten Button an ein bestimmtes Klickereignis zu binden, indem ich einen RelayCommand (AdditionalInfoCommand) in das ViewModel des Elements einfüge. Jetzt ist mein Hauptproblem der oben erwähnte Fehler, der nach AdditionalInfoCommand ausgelöst wird, und ich nehme an, dass es daran liegt, dass es von ItemClickCommand erfasst wird. Seltsam wie Sie vermuten würden, dass es das gleiche ViewModel verwendet.

Gibt es eine Möglichkeit, den Itemclick nicht auszulösen, wenn diese Schaltfläche angetippt wird?

Danke.

Thierry

Antwort

0

Ich fand es heraus.

Wenn ich den Knopf in meinem Listview Datatemplate tippen, wird der Button das Ansichtsmodell des Artikels übergeben wird, die korrekt ist, aber dann wird die Antippereignis zurück zum Mutter sprudelte, die durch eingefangen wird:

<interactivity:Interaction.Behaviors> 
    <core:EventTriggerBehavior EventName="Tapped"> 
     <core:InvokeCommandAction Command="{Binding ItemClickCommand}" 
      CommandParameter="{Binding SelectedItem}" /> 
    </core:EventTriggerBehavior> 
</interactivity:Interaction.Behaviors> 

Während Es könnte eine Lösung geben, um das Ereignis zu stoppen. Um das Problem zu umgehen, habe ich mein ItemClickCommand geändert.

Es wurde wie folgt definiert:

private RelayCommand<MyItemViewModel> _itemClickCommand; 

public RelayCommand<MyItemViewModel> ItemClickCommand 
{ 
    get { return this._itemClickCommand ?? (this._itemClickCommand = 
    new RelayCommand<MyItemViewModel>((viewModel) => 
    ItemClickCommandAction(viewModel))); } 
} 

änderte ich es einfach zu:

private RelayCommand<object> _itemClickCommand; 

public RelayCommand<object> ItemClickCommand 
{ 
    get { return this._itemClickCommand ?? (this._itemClickCommand = 
    new RelayCommand<object>((viewModel) => 
    ItemClickCommandAction(viewModel))); } 
} 

ich die ItemClickCommandAction dann verändert in einem object statt MyItemViewModel und jetzt zu nehmen, im Rahmen des Verfahrens, Ich überprüfe die type des ViewModel, das übergeben wird:

private void ItemClickCommandAction(object currentObject) 
{ 
    if (currentObject is MyItemViewModel) 
    { 
     //go to next page 
    } 
}