繁体   English   中英

WP8 LongListSelector事件序列

[英]WP8 LongListSelector event sequence

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

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

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

困难在于确定从模板项目的tap事件中选择哪个项目,因为SelectionChanged事件 Tap事件之后触发。 在此阶段,SelectedItem尚未更新,并且包含最后一个选择,该选择可以为null。

我当前的想法是使用Dispatcher调用一个Action,然后再使用SelectedItem,从本质上重现了古代VB的“ DoEvents”。

这有效,但作为罪恶是丑陋的。 有人有更好的主意吗?


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

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;
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM