我正在写一个Windows-phone 7应用程序。我有一个页面,其中包含ListBox中包含的TextBlock列表。我想要的行为是,在单击其中一个TextBlock时,页面被重定向到另一个,将TextBlock的Text作为参数传递。
这是xaml代码:(这里我绑定到一个字符串集合,并且事件MouseLeftButtonDown附加到每个TextBlock)。
<ListBox x:Name="List1" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock MouseLeftButtonDown="List1_MouseLeftButtonDown" Text="{Binding}"
FontSize="20"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
但这对我来说是不成功的。我已经尝试将MouseLeftButtonDown事件附加到单个TextBox或ListBox。我一使用NavigationService.Navigate(uri)就提出了例外。应该附加哪个活动?该活动是应该附加到单个项目还是作为整体列表?
通过使用HyperlinkButton填充ListBox,我找到了一种解决此问题的方法。但是,我想了解为什么TextBox方法不起作用。
这是我第一次使用Silverlight,所以我可能会遗漏一些基本的东西。
答案 0 :(得分:1)
有几种方法可以做到这一点,但我将引导您完成最简单的方法之一(但不是最简单的建筑方面)。
基本上你想知道ListBox的选择何时发生变化。 ListBox引发一个SelectionChanged事件,该事件可以在后面的代码中被监听。
<ListBox x:Name="List1" ItemsSource="{Binding}" SelectionChanged="SelectionChangedHandler" SelectionMode="Single" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" FontSize="20"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
然后有一个像:
这样的处理程序private void SelectionChangedHandler(object sender, SelectionChangedEventArgs e)
{
IList selectedItems = e.AddedItems;
string val = selectedItems.OfType<string>().FirstOrDefault();
NavigationService.Navigate(new Uri(val));
}
您需要注意的一件事是ListBoxes支持多种选择。因此,事件参数会返回所选项的列表。为简单起见,我所做的就是从该列表中获取第一个值并将其用作导航值。请注意我如何将ListBox的SlectionMode属性设置为Single,这将确保用户只能选择一个项目。
如果我真的这样做,我会考虑创建一个TriggerAction,可以通过xaml连接到一个事件触发器,这将删除for代码。如果您有人参与,请查看this link。
答案 1 :(得分:1)
除了Chris和James的回复之外,我还要补充一点,你还需要清除事件处理程序中的列表框选择,否则用户将无法在列表框中点击两次相同的项目(因为该项目已被选中)。
使用James的方法,我将更改SelectionChangedHandler()实现,如下所示:
private void SelectionChangedHandler(object sender, SelectionChangedEventArgs e)
{
// Avoid entering an infinite loop
if (e.AddedItems.Count == 0)
{
return;
}
IList selectedItems = e.AddedItems;
string val = selectedItems.OfType<string>().FirstOrDefault();
NavigationService.Navigate(new Uri(val));
// Clear the listbox selection
((ListBox)sender).SelectedItem = null;
}
答案 2 :(得分:0)
我建议将ListBox的SelectedItem属性绑定到ViewModel中的属性。然后,在ListBox的SelectedItemChanged事件上,导航到在QueryString上传递数据键的相应URL,或者升级到MVVM Light之类的东西,并将实际的SelectedItem对象放在消息总线上以供子窗口拾取。我在Skydrive上有第二种方法的示例,您可以查看。
HTH!
克里斯