WP8 LongListSelector事件序列

时间:2013-11-05 00:22:43

标签: c# windows-phone-8 windows-8.1 longlistselector

我的应用程序是一种排序的电话簿,由LongListSelector列出并由DataTemplate布局(如您所料)。模板在页面资源中定义,因此将事件处理程序绑定到其元素之一的tap事件没有问题。

用户可以使用条目执行各种操作,具体取决于点击的元素:

  • 名称:添加到联系人
  • 号码:拨打号码
  • 地址:地图位置

难点在于确定从模板项目的点击事件中选择了哪个项目,因为SelectionChanged事件在 Tap事件之后触发。在此阶段,SelectedItem尚未更新,并包含 last 选项,可能为null。

我目前的想法是使用Dispatcher调用一个Action,然后使用SelectedItem,基本上复制古代VB的“DoEvents”。

这有效,但它像罪一样难看。任何人都有更好的想法吗?


您无法在Windows应用商店应用中执行上述操作。同样丑陋但技术上要求不高的解决方案可以在两个平台上运行是声明页面级变量并将其设置在点击处理程序中

string _pendingTap;

private void phoneNumber_Tapped(object sender, TappedRoutedEventArgs e)
{
  _pendingTap = "phoneNumber";
}

private void address_Tapped(object sender, TappedRoutedEventArgs e)
{
  _pendingTap = "address";
}

private void name_Tapped(object sender, TappedRoutedEventArgs e)
{
  _pendingTap = "name";
}

然后在网格的ItemClick事件处理程序

中使用此信息
private void gridviewResult_ItemClick(object sender, ItemClickEventArgs e)
{
 var entry = e.ClickedItem as Entry; //hurrah, in scope!
 switch (_pendingTap)
  {
    case "name":
      //do whatever you do with an entry when the name is tapped (eg add to contacts)
      break;
    case "address":
      //do whatever you do with an entry when the address is tapped (eg map)
      break;
    case "phoneNumber":
      //do whatever you do with an entry when the name is tapped (eg call number)
      break;
  }
  _pendingTap = null;
}

当我说它可以在两个平台上运行时,我的意思是你可以使用完全相同的方法。不幸的是,平台事件的名称和签名都不同。

1 个答案:

答案 0 :(得分:0)

如果点击的元素在LongListSelector内,你可以在元素上使用命令吗? (例如:http://www.geekchamp.com/articles/how-to-bind-a-windows-phone-control-event-to-a-command-using-mvvm-light