在Silverlight中,如何将ListBox项目选择绑定到Navigate事件?

时间:2010-06-29 16:59:40

标签: c# visual-studio silverlight windows-phone-7

我正在写一个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)就提出了例外。应该附加哪个活动?该活动是应该附加到单个项目还是作为整体列表?

通过使用HyperlinkBut​​ton填充ListBox,我找到了一种解决此问题的方法。但是,我想了解为什么TextBox方法不起作用。

这是我第一次使用Silverlight,所以我可能会遗漏一些基本的东西。

3 个答案:

答案 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!
克里斯