2012-03-13 108 views
0

我正在构建一个WP7应用程序,该应用程序由第一页中的一个列表框组成,以显示多个任务的标识以及显示每个任务(选定)的详细信息的详细信息页面。ListBox的SelectionChanged事件。在页面之间传递参数

我需要将任务ID从第一页传递到第二页。我知道它是由ListBox的SelectionChanged事件执行的。

这是我的XAML代码:

<phone:PhoneApplicationPage 
    x:Class="TaskListAlpha03.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696" 
    FontFamily="{StaticResource PhoneFontFamilyNormal}" 
    FontSize="{StaticResource PhoneFontSizeNormal}" 
    Foreground="{StaticResource PhoneForegroundBrush}" 
    SupportedOrientations="Portrait" Orientation="Portrait" 
    shell:SystemTray.IsVisible="True"  
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"> 

    <phone:PhoneApplicationPage.Resources> 
     <DataTemplate x:Key="TaskListListBoxTemplate">    
      <StackPanel Orientation="Vertical" Margin="0,0,0,20">     
       <TextBlock Text="{Binding Crm_object_id}" FontSize="32" FontFamily="Segoe WP Bold" Foreground="Gray"/> 
       <!--<TextBlock Text="{Binding Comment}" Margin="10,0,0,0"/>    --> 
      </StackPanel>    
     </DataTemplate> 
    </phone:PhoneApplicationPage.Resources> 

     <!--LayoutRoot is the root grid where all page content is placed--> 
    <Grid x:Name="LayoutRoot" Background="Transparent"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <!--TitlePanel contains the name of the application and page title--> 
     <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,40"> 
      <TextBlock x:Name="ApplicationTitle" Text="TASK LIST ALPHA" Style="{StaticResource PhoneTextNormalStyle}"/> 
      <TextBlock x:Name="PageTitle" Text="tasks" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
     </StackPanel> 

     <!--ContentPanel - place additional content here--> 
     <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
      <ListBox 
         x:Name="allTaskListTasksListBox" 
         ItemsSource="{Binding AllTaskListTasks}" 
         ItemTemplate="{StaticResource TaskListListBoxTemplate}" 
         SelectionChanged="allTaskListTasksListBox_SelectionChanged" /> 
     </Grid> 
    </Grid> 


</phone:PhoneApplicationPage> 

这是CS代码:

private void allTaskListTasksListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    {    
     ListBoxItem lbi = ((sender as ListBox).SelectedItem as ListBoxItem); 
     NavigationService.Navigate(new Uri("/View/Details.xaml?msg=" + lbi.Content.ToString(), UriKind.RelativeOrAbsolute)); 
    } 

在第二页我有这样的示例代码,检查是否正常工作:

protected override void OnNavigatedTo 
     (System.Windows.Navigation.NavigationEventArgs e) 
     { 
      base.OnNavigatedTo(e); 
      string msg = ""; 
      if (NavigationContext.QueryString.TryGetValue("msg", out msg)) 
       PageTitle.Text = msg; 
     } 

当我执行应用程序时,我有一个“NullReferenceException”。

对不起,我的英语:S和谢谢。

回答

0

一对夫妇在这里的点...
1)我想对项目使用点按事件,而不是一个选择改变事件。它有助于防止意外导航。
2)如果你使用choosechanged事件,请尝试下面的代码来获取您的项目。如果在列表中取消选中某个项目,您当前的代码将尝试启动。

private void allTaskListTasksListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if(e.AddedItems.Count > 0) // the items that were added to the "selected" collection 
    { 
     var mySelectedItem = e.AddedItems[0] as myItemType; 
     if(null != mySelectedItem) // prevents errors if casting fails 
     { 
      NavigationService.Navigate(
       new Uri("/View/Details.xaml?msg=" + mySelectedItem.Crm_object_id, 
         UriKind.RelativeOrAbsolute) 
      ); 
     } 
    } 
} 
+0

非常感谢你;) – javiazo 2012-03-13 16:33:43

+0

我已经使用了你的第二个技巧和工作正常,坦克 – javiazo 2012-03-13 16:34:24

0

问题出在ListBoxItem lbi = ((sender as ListBox).SelectedItem as ListBoxItem);。您将它转换为ListBoxItem,实际上它是您将其绑定到ListBox的自定义项目。这样做:

var item = ((sender as ListBox).SelectedItem as YourItem);

+0

也谢谢你:)) – javiazo 2012-03-13 16:34:47