问题是我无法获取显示上下文菜单的项目。
对于这个问题,如果您像这样向ListView
添加数据:
<ListView RightTapped="ListView_RightTapped">
<x:String>First Item</x:String>
<x:String>Second Item</x:String>
<x:String>Third Item</x:String>
<x:String>Fourth Item</x:String>
<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>
您可以在RightTapped
事件中通过以下方式获取项的上下文:
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext;
}
在这种情况下,“a”将直接获取所点击项的字符串格式内容。
如果您使用如下所示的DataTemplate向ListView添加数据:
<ListView RightTapped="ListView_RightTapped" ItemsSource="">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock 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>
通常使用DataTemplate
时,我们会像这样通过ObservableCollection
添加数据:
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" });
}
"
这里的“List”类是很简单的测试类:
"
public class List
{
public string text { get; set; }
}
然后在RightTapped
事件中,我们也可以获取DataContext
:
private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
ListView listView = (ListView)sender;
allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
var a = ((FrameworkElement)e.OriginalSource).DataContext;
}
但是这次,“a”实际上是项目内的“List”对象(请参见“List”类),因为项目的内容现在是一个“List”对象,而不是一个字符串。所以我们可以像这样获取此对象的文本属性:
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;
}
我认为你最终希望在 Flyout
的按钮单击事件中编辑内容,你可以像这样做:
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 = "";
}
另一个问题是,上下文菜单也会显示在列表视图项之外(例如在边框上)。
您能解释一下吗?我不太理解。您是指将内容显示在Flyout中吗?如果是这样,我认为上述方法可以解决此问题。如果不是,请留下评论,我会看看是否能解决此问题。
由于触发的事件是RightTapped,我不确定在移动设备上长按是否会显示上下文菜单。
我认为这里的“长按”事件指的是像这样的Holding
事件吗?
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;
}
我在移动模拟器上进行了测试,它运行良好。尽管我在这里写了一个相当长的答案,但关键点非常简单,您只需使用((FrameworkElement)e.OriginalSource).DataContext
即可获取项目的上下文。
null
。一直没有成功将Command
属性附加到任何东西上。 - escape-llc