【发布时间】:2013-11-15 18:53:58
【问题描述】:
我的应用程序是一个电话簿,由 LongListSelector 列出并由 DataTemplate 布局(如您所料)。模板在页面资源中定义,因此将事件处理程序绑定到其元素之一的点击事件是没有问题的。
根据点击的元素,用户可以对条目执行多种操作:
- 姓名:添加到联系人
- 号码:拨打号码
- 地址:地图位置
困难在于确定从模板项的点击事件中选择了哪个项目,因为SelectionChanged 事件会在点击事件之后触发。在这个阶段,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;
}
当我说它可以在两个平台上运行时,我的意思是您可以使用完全相同的方法。不幸的是,不同平台的点击事件的名称和签名都不同。
【问题讨论】:
标签: c# windows-phone-8 windows-8.1 longlistselector