Il problema è che non sono in grado di ottenere punto in cui è stato visualizzato il menu di scelta rapida.
Per questo problema, se si aggiungono i dati al ListView
in questo modo:
È possibile ottenere il contesto del prodotto in caso RightTapped
in questo modo:
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext;
}
In questo scenario , "a" otterrà direttamente il contenuto in formato stringa dell'elemento selezionato.
se si aggiungono i dati di ListView
utilizzando DataTemplate
come questo:
<ListView RightTapped="ListView_RightTapped" ItemsSource="{x:Bind list}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding text}" />
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Resources>
<MenuFlyout x:Name="allContactsMenuFlyout">
<MenuFlyout.Items>
<MenuFlyoutItem x:Name="Edit" Text="Edit" />
<MenuFlyoutItem x:Name="Remove" Text="Remove" Click="Remove_Click" />
</MenuFlyout.Items>
</MenuFlyout>
</ListView.Resources>
</ListView>
e di solito quando si utilizza DataTemplate
, aggiungiamo i dati da ObservableCollection
come questo:
private ObservableCollection<List> list = new ObservableCollection<List>();
public MainPage()
{
this.InitializeComponent();
list.Clear();
list.Add(new List { text = "Item 1" });
list.Add(new List { text = "Item 2" });
list.Add(new List { text = "Item 3" });
list.Add(new List { text = "Item 4" });
list.Add(new List { text = "Item 5" });
}
"Lista" di classe è abbastanza semplice qui per la prova:
public class List
{
public string text { get; set; }
}
Poi anche possiamo ottenere il DataContext
in RightTapped
evento:
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext;
}
Ma questa volta, "a" è in realtà la 'Lista' oggetto (si prega di fare riferimento alla classe "List") all'interno della voce, perché la il contenuto dell'elemento ora è un oggetto 'Elenco', non più una stringa. Così possiamo ottenere la proprietà testo di questo oggetto come questo:
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext as List;
var content = a.text;
}
Penso che alla fine si desidera modificare il contenuto in caso Button click del Flyout
, si può fare per esempio come questo:
private string content;
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext as List;
content = a.text;
}
private void Remove_Click(object sender, RoutedEventArgs e)
{
foreach (var item in list.ToList())
{
if (item.text == content)
{
list.Remove(item);
}
}
content = "";
}
Un altro problema è che il menu di scelta rapida viene visualizzato anche al di fuori dell'elemento di visualizzazione elenco (ad esempio sui bordi).
Puoi spiegare questo? Non riesco a capirlo.Intendi la visualizzazione del contenuto, ad esempio nello Flyout
? Se è così, penso che il metodo sopra possa risolvere questo problema. In caso contrario, puoi lasciare un commento e vedrò se questo problema può essere risolto.
E poiché l'evento che viene attivato è RightTapped, non sono sicuro se il menu di scelta rapida verrà visualizzato sul clic lungo sui dispositivi mobili.
Penso che l'evento "clic lungo" qui indichi l'evento Holding
come questo?
private void ListView_Holding(object sender, HoldingRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext as List;
content = a.text;
}
Ho appena testato su Mobile Emulator, funziona bene. Anche se ho scritto una risposta piuttosto lunga qui, ma il punto chiave è abbastanza semplice, puoi semplicemente usare ((FrameworkElement)e.OriginalSource).DataContext
per ottenere il Contesto dell'oggetto.
THX per la risposta. Ci proverò. Ma l'evento che fa scattare questo è ancora fare clic destro sulla visualizzazione elenco. Quindi verrà attivato e. g. quando faccio clic con il pulsante destro del mouse sull'intestazione di un gruppo nella visualizzazione elenco o su un bordo. Mi aspettavo qualcosa di veramente facile da implementare, poiché questa è una funzionalità comune. – miskohut
Il binding ha senso ma è sempre 'null'. Non ho avuto successo a ottenere la proprietà 'Command' da allegare a qualsiasi cosa. –
Provare a utilizzare 'Behaviors' e' InvokeCommandAction' dal framework prisma – Archana