2016-11-29 6 views
0

Ich versuche, ein angeklicktes Element von einem ListItemView.Tag an einen Typ anzuhängen, damit ich es in der Navigation verwenden kann. Ich bin ein wenig verwirrt, wie man das Objekt anbringt.Zugriff auf ListViewItem.Tag vom ItemClick-Handler

private void ListView_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    this.Frame.Navigate(
     typeof(ListViewItem.Tag), 
     e.ClickedItem, 
     new Windows.UI.Xaml.Media.Animation.DrillInNavigationTransitionInfo()); 
    } 

Hier ist, was meine XAML wie für aussieht ..

<ListView x:Name="ContentList" 
      Grid.Row="1" 
      Header="Select a group to view" 
      EntranceNavigationTransitionInfo.IsTargetElement="True" 
      IsItemClickEnabled="True" 
      ItemClick="ListView_ItemClick" 
      Margin="24,0,0,0"> 
    <ListView.HeaderTemplate> 
     <DataTemplate> 
      <TextBlock Style="{StaticResource BodyTextBlockStyle}" Margin="12,4" Text="{Binding}"/> 
     </DataTemplate> 
    </ListView.HeaderTemplate> 
    <ListViewItem Content="Open Group" Tag="OpenGroup"/> 
    <ListViewItem Content="Closed Group" Tag="ClosedGroup"/> 
</ListView> 

ich im Grunde this.Frame.Navigate(typeof(OpenGroup)); aus Klicken auf die Open Group Artikel generieren möchten und mit der Tag meiner Seite Namen zu ändern.

Ich möchte dies für jedes Element, das ich der Liste für die einfache Navigation Änderung hinzufügen.

Dank

+1

Das Tag ist Objekt, nicht der Typ. – lindexi

+0

Type.GetType ((Absender als ListViewItem) .Tag.ToString()) – Gusman

+0

Vielen Dank für beide Antworten. Ich bin hier noch ein bisschen verloren. Es ist 10 Jahre her, seit ich das letzte Mal wirklich programmiert habe, also lerne ich hier irgendwie neu. Ich versuche, mit dem Vorschlag zu arbeiten, jedoch zieht .tag ein Framework-Element und gibt einen Nullwert zurück. Ich bin mir bewusst, dass es ein Framework-Element sein sollte, jedoch sollte es einen Wert von OpenGroup oder ClosedGroup geben, nicht null. Ich bin mir auch nicht sicher, wie ich die Zeichenkette als Typ an typeof() übergeben würde, da typeof keine Zeichenkette akzeptiert. –

Antwort

0

Mit einfachen ListViewItems Sie Ihr Ziel nicht leicht erreichen. Im ItemClick Handler haben Sie nur Zugriff auf den angeklickten "Gegenstand", der nur der string Wert ist, den Sie in den Content des ListViewItem und nicht den ListViewItem selbst eingegeben haben. Das heißt, Sie haben auch keinen Zugriff auf die Tag.

Sie müssen eine benutzerdefinierte Klasse erstellen, die Ihre „Menüpunkte“ halten:

public class MenuItem 
{ 
    public MenuItem(string displayText, Type targetPage) 
    { 
     DisplayText = displayText; 
     TargetPage = targetPage; 
    } 

    public string DisplayText { get; } 

    public Type TargetPage { get; } 
} 

Wie Sie sehen können, habe ich bereits enthalten eine Type Eigenschaft, um die Seite zu halten, die Sie wollen navigieren zu. Jetzt im Konstruktor Ihrer aktuellen Seite Sie dies tun, nachdem this.InitializeComponent();:

ContentList.ItemsSource = new List<MenuItem>() 
{ 
    new MenuItem("Open Group", typeof(OpenGroupPage)), 
    new MenuItem("Closed Group", typeof(ClosedGroupPage)), 
}; 

diese Weise können wir die Einzelteile als die Quelle für die ListView gesetzt haben. Jetzt hat die Steuerung einige Eingaben, weiß aber nicht , wie man eine MenuItem anzeigt. Also müssen wir es aktualisieren, indem Sie eine ItemTemplate Zugabe:

<ListView x:Name="ContentList" 
     Grid.Row="1" 
     Header="Select a group to view" 
     EntranceNavigationTransitionInfo.IsTargetElement="True" 
     IsItemClickEnabled="True" 
     ItemClick="ListView_ItemClick"     
     Margin="24,0,0,0"> 
    <ListView.HeaderTemplate> 
     <DataTemplate> 
      <TextBlock Style="{StaticResource BodyTextBlockStyle}" Margin="12,4" Text="{Binding}"/> 
     </DataTemplate> 
    </ListView.HeaderTemplate> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding DisplayText}" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Beachten Sie, dass die ursprünglichen ListViewItem Elemente sollten entfernt werden, sind sie nicht mehr benötigt werden.

Schließlich werden wir die ItemClick Handler aktualisieren, um die neuen MenuItem Instanzen zu verwenden:

private void ListView_ItemClick(object sender, ItemClickEventArgs e) 
{    
    var menuItem = e.ClickedItem as MenuItem; 
    this.Frame.Navigate(
     menuItem.TargetPage, 
     menuItem.DisplayText, 
     new Windows.UI.Xaml.Media.Animation.DrillInNavigationTransitionInfo()); 
} 

Da die ItemsSource der ListView auf eine Liste von MenuItem gesetzt ist, nun die ClickedItem Eigenschaft enthält eine MenuItem Instanz, die angeklickt wurde . Die TargetPage Eigenschaft ist die Seite, zu der Sie navigieren, und der DisplayText ist der Text, der im Menü angezeigt wird.

+0

Ein anderer Ansatz, genau das zu tun, was ich erreichen wollte, absolut felsenfest. Vielen Dank. –

1

Ich möchte grundsätzlich this.Frame.Navigate (typeof (OpenGroup)); Klicken Sie auf den Eintrag "Gruppe öffnen" und verwenden Sie den Tag, um den Seitennamen zu ändern.

Teil einverstanden mit @ Martin Zikmund, da Sie ListViewItem mit String-Inhalte in Ihrem ListView direkt in XAML hinzugefügt, wir die ListViewItem im ItemClick Ereignis nicht zugreifen können, um ihre ListViewItem zuzugreifen und schließlich Zugriff auf die Tag Eigenschaft Wenn ein Objekt angeklickt wird, können wir das Ereignis SelectionChanged anstelle des Ereignisses ItemClick verwenden. Zum Beispiel:

<ListView x:Name="ContentList" 
     Header="Select a group to view" 
     EntranceNavigationTransitionInfo.IsTargetElement="True" 
     SelectionMode="Single" 
     SelectionChanged="ContentList_SelectionChanged" 
     Margin="24,0,0,0"> 
    <ListView.HeaderTemplate> 
     <DataTemplate> 
      <TextBlock Margin="12,4" Text="{Binding}" /> 
     </DataTemplate> 
    </ListView.HeaderTemplate> 
    <ListViewItem Content="Open Group" Tag="OpenGroup"/> 
    <ListViewItem Content="Closed Group" Tag="ClosedGroup"/> 
</ListView> 

Ich bin mir bewusst, dass es ein Rahmenelement sein sollte, aber es sollte ein Wert von Opengroup oder ClosedGroup, nicht null. Ich bin mir auch nicht sicher, wie ich die Zeichenkette als Typ an typeof() übergeben würde, da typeof keine Zeichenkette akzeptiert.

Dann im Ereignis SelectionChanged ist es wichtig, den Typ Ihrer Tag-Eigenschaft zu erhalten. Wie Sie es getan haben, können wir ToString() Methode verwenden, um das Tag-Objekt in Zeichenfolge zu konvertieren, aber wenn Sie seinen Typ erhalten, wird es Null zurückgeben. Das Hauptproblem für dieses Problem ist, dass in UWP brauchen wir den Namespace und diese Art String zusammen zu bauen, hier ist die Probe:

private void ContentList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var item = e.AddedItems.FirstOrDefault() as ListViewItem; //single selection mode 
    var type = Type.GetType("UWPControlsIssues4." + item.Tag.ToString()); //my project namespace is "UWPControlsIssues4" 
    frame.Navigate(type); 
} 

ich diese Antwort schrieb sage nicht, Martin Antwort falsch ist, zu tun, dass Sie Sie müssen Ihr Datenmodell erstellen und eine Menge Code ändern, und normalerweise erledigen wir diese Arbeit auf Martins Art und Weise. Ich denke, diese Antwort ist die Methode, die Sie verwenden würden.

+0

Vielen Dank für Ihre Hilfe. VIEL Fortschritt, jedoch gibt Typ noch Null. Frame.Navigate (Typ); löst eine Null-Ausnahme aus. Ich kann sehen, dass die Zeichenfolge item.tag korrekt weitergegeben wird, jedoch nicht an den Typ angehängt wird. Dies ist die letzte Hürde, die ich in diesem Teil meiner App habe. Lol .. Meine Arbeit ist so hässlich. –

Verwandte Themen