WP7在页面之间传递XML数据

时间:2011-10-28 15:28:55

标签: c# xaml windows-phone-7

只需要一些指导。 lemme首先发布代码:

XAML:

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <TextBlock Name="subjectBlock" Text="{Binding SubjectName}" FontSize="26" TextWrapping="Wrap" Foreground="{StaticResource PhoneAccentBrush}" Tap="subjectBlock_Tap" />
            <TextBlock Text="{Binding LecturerName}" FontSize="24" IsHitTestVisible="False" />
            <TextBlock Text=" "/>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

C#代码:

XDocument xmlCourse = XDocument.Load(xmlFile);

var xmlData = from subject in xmlCourse.Descendants("subject")
              select new Subject
              {
                  SubjectID    = subject.Element("subjectID").Value,
                  SubjectName  = subject.Element("subjectName").Value,
                  LecturerName = subject.Element("lecturerName").Value
              };

subjectList.ItemsSource = xmlData;

xmlFile.Close();

...

private void subjectBlock_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{            
    NavigationService.Navigate(new Uri("/eIICS;component/Pages/Coursework.xaml?type=2&subject=" + subjectid, UriKind.Relative));
}

我试图通过tapped事件将SubjectID传递给另一个页面。我通过xml拉取数据,每个人都有一个ID,我想知道是否有办法直接/间接传递该ID?

但我似乎还不知道如何绕过它。

一些指导会非常好。谢谢。刚刚开始使用WP7。

欢呼声。

2 个答案:

答案 0 :(得分:1)

根据到目前为止实现的内容,最简单的方法是从textblock对象中检索数据上下文并将其传递给下一页。添加到上面写的处理程序:

private void subjectBlock_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
  var textblock = sender as TextBlock;
  if(null != textblock) {
      var subject = textblock.DataContext as Subject;
      if(null != subject) {
        string subjectid = subject.SubjectID;
        NavigationService.Navigate(new Uri("/eIICS;component/Pages/Coursework.xaml?type=2&subject=" + subjectid, UriKind.Relative));
      }
    }

但是,我还想指出,这可能不是最好的解决方案。使用事件处理程序来处理所有用户交互可能会使您的代码难以维持超时,并且很难为事件处理程序编写测试用例。您可以考虑使用MVVMLight等MVVM框架来帮助提高代码的可检测性。该框架带有一个命令系统,可以将视图(XAML)与代码(.cs)分离。它将为您节省很多麻烦=)

链接到MVVMLight项目:http://www.galasoft.ch/mvvm/

关于指挥框架的帖子:http://blog.galasoft.ch/archive/2009/09/26/using-relaycommands-in-silverlight-and-wpf.aspx

答案 1 :(得分:0)

解决。感谢Leo Tse给我指点。我搜索了更多,我发现了这个 - http://mobile.tutsplus.com/tutorials/windows/windows-phone-7-silverlight-tutorial/

由于我使用的是ListBox,我只想传递SubjectID。使用ListBox.SelectedItem作为对象运行良好。虽然我不确定这是否是hacky但似乎是正确的。

private void subjectBlock_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{   
    var subject = subjectList.SelectedItem as Subject;
    if (null != subject) 
    {
        string subjectid = subject.SubjectID;
        NavigationService.Navigate(new Uri("/eIICS;component/Pages/Coursework.xaml?type=2&subjectid=" + subjectid, UriKind.Relative));
    } 
}

还在学习WP7。到目前为止爆炸了!