2016-03-25 11 views
-1

Ich möchte eine Gridview-Klick in ein DataTemplate-Element binden. Ich muss das DataTemplate-Element verwenden, wie es für HubSections erforderlich ist.Binding-Klick-Handler in DataTemplate

Wenn ich diesen Befehl innerhalb des Datatemplate-Elements binden, erhalte ich eine Fehlermeldung:

"Object reference not set to an instance of an object"

<Frame x:Name="frame"> 
    <Hub VerticalAlignment="Center" HorizontalAlignment="Center" > 
    <HubSection Width="250" x:Name="section1" IsHeaderInteractive="True" > 
        <DataTemplate> 
         <GridView IsItemClickEnabled="True" ItemClick="{x:Bind MainPageVM.click}"> 
          <RelativePanel> 
           <Image x:Name="image" Source="Assets/1.png" Width="Auto" Height="250" /> 
           <TextBlock x:Name="page1" Text="page1" /> 
          </RelativePanel> 
         </GridView> 
        </DataTemplate> 
       </HubSection> 

       //.... 
     </Hub>    
</Frame> 

Wenn ich jedoch den gleichen Handler außerhalb eines Datatemplate-Elements (zum Beispiel HubSectionHeaderClick) binde es ist funktioniert gut.

Aber ich verstehe nicht warum? Und welche Möglichkeiten muss ich haben, um das zu lösen?

Edit: Hier ist die XAML mit dem Elementname:

<Hub VerticalAlignment="Center" HorizontalAlignment="Center" x:Name="ThisIsHub" > 

und die Bindung:

Binding ElementName=ThisIsHub, Path=DataContext.click 

den Fehler bekommen:

Cannot resolve property "click" in data context of type 'object'

+0

[Dies] (http://stackoverflow.com/questions/27232849/silverlight-datatemplate-binding-to- click-event) Problem scheint ähnlich zu sein, funktioniert aber nicht unter UWP/Win10. – inix42

+0

Ich denke, Datenkontext von dstatemplate ist anders – Archana

+0

Geben Sie Hub-Steuerelement einen Namen. Verwenden Sie diese Bindung {Binding ElementName = '' Hubrlement '', Path = "DataContext.clickcommand}. Angenommen, Ihr Hub-Element dstacontext verweist auf MsinPageVM. Lassen Sie mich wissen, ob es funktioniert – Archana

Antwort

0

Wenn es zu binden, kommt das Click-Ereignis auf einer GridView/ListView I immer dieses Tutorial folgen (hier ist der Link: https://marcominerva.wordpress.com/2013/03/07/how-to-bind-the-itemclick-event-to-a-command-and-pass-the-clicked-item-to-it/)

Zuerst Sie haben eine Klasse erstellen, die eine angefügte Eigenschaft definieren:

public static class ItemClickCommand 
{ 
    public static readonly DependencyProperty CommandProperty = 
    DependencyProperty.RegisterAttached("Command", typeof(ICommand), 
    typeof(ItemClickCommand), new PropertyMetadata(null, OnCommandPropertyChanged)); 

    public static void SetCommand(DependencyObject d, ICommand value) 
    { 
     d.SetValue(CommandProperty, value); 
    } 

    public static ICommand GetCommand(DependencyObject d) 
    { 
     return (ICommand)d.GetValue(CommandProperty); 
    } 

    private static void OnCommandPropertyChanged(DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
    { 
     var control = d as ListViewBase; 
     if (control != null) 
      control.ItemClick += OnItemClick; 
    } 

    private static void OnItemClick(object sender, ItemClickEventArgs e) 
    { 
     var control = sender as ListViewBase; 
     var command = GetCommand(control); 

     if (command != null && command.CanExecute(e.ClickedItem)) 
      command.Execute(e.ClickedItem); 
    } 
} 

Dann einfach in XAML es auf diese Weise verwenden (Es funktioniert sowohl auf Listview/Gridview):

helpers:ItemClickCommand.Command="{Binding Click} 

wo helpers den Namensraum ist, in dem die angefügten Eigenschaft

in y definiert haben Unser Viewmodel dann definieren Sie den Befehl:

private RelayCommand<MyItem> click; 
public RelayCommand<MyItem> Click 
{ 
    get 
    { 
     if (click== null) 
     { 
      click= new RelayCommand<MyItem>( 
       (item) => 
       {        
        //do something with your item 
       }); 
     } 

     return click; 
    } 
} 

Lassen Sie mich wissen, ob es funktioniert!

+0

Danke, aber das Problem ist nicht die ItemView, ich habe auch versucht, den Klick auf eine Schaltfläche (innerhalb der DataTemplate) zu binden, aber das funktioniert auch nicht. Ich denke, irgendwie ist der DataContext anders. – inix42

0

Ich denke, dass Ihr Ansichtsmodell an hubsection DataContext gebunden ist, so dass es funktioniert, wenn Sie den Befehl zum HubSectionHeaderClicked -Ereignis setzen. Also versuchen Sie dieses

Mit dieser Bindung

{Binding ElementName=section1,Path="DataContext.clickcommand} 

Lassen Sie mich wissen, ob es funktioniert