【问题标题】:Windows Phone 7 - Passing / transferring selected data from listboxWindows Phone 7 - 从列表框中传递/传输选定的数据
【发布时间】:2014-03-05 17:21:43
【问题描述】:

我正在创建一个应用程序,我通过 Web 服务从 DB 获取数据并将其显示在我的 mainpage.xaml 的列表框中(有关不同事件的数据,例如 EventTitle、Date 等)目前我已经设置因此,选择列表框中的项目时,应用程序导航到“EventDetail”页面,该页面仅从列表中描绘出所选数据。

我需要帮助的是获取此用户选择的数据并将其带到要使用的导航页面。我正在努力以最简单的方式弄清楚;如何将用户选择的列表框项目转移到定义的页面以更清晰的方式显示它并使用此数据。

最好我想在导航页面内的单独文本块中显示每个文本块/单元格(事件标题、日期等),以便它们可以适当地布置,但只有选定字段数据的列表框可以完成这项工作。

这里是相关的 Xaml 代码:

   <ListBox  Height="496" HorizontalAlignment="Left" Margin="-4,155,0,0" Name="FirstListBox2" VerticalAlignment="Top" Width="460" SelectionChanged="FirstListBox2_SelectionChanged">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Height="132">

                            <StackPanel Width="370">
                                <TextBlock Text="{Binding EventID}" Foreground="#FFC8AB14" FontSize="24" />
                                <TextBlock Text="{Binding EventList}" TextWrapping="Wrap" FontSize="36" />
                                <TextBlock Text="{Binding Date}" TextWrapping="Wrap" FontSize="24" />
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

这里是相关的C#编码:

     private void FirstListBox2_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        EventServiceReference1.Event myEvent = (EventServiceReference1.Event)FirstListBox2.SelectedItem;
        NavigationService.Navigate(new Uri("/EventPageTemp.xaml", UriKind.Relative));
    }

如果您能帮我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: c# xaml windows-phone-7 listbox


    【解决方案1】:

    使用查询字符串参数发送选择的值:

    EventServiceReference1.Event myEvent = (EventServiceReference1.Event)FirstListBox2.SelectedItem;
    int eventId = myEvent.EventID;
    string url = string.Format("/EventPageTemp.xaml?eventId={0}", eventId);
    NavigationService.Navigate(new Uri(url, UriKind.Relative));
    

    您可以使用NavigationContext.QueryString pick up the event parameter on the target page。然后根据需要设置目标页面的数据上下文:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        int eventId;
        string eventIdStr;
        if (NavigationContext.QueryString.TryGetValue("eventId", out eventIdStr) && int.TryParse(eventIdStr, out eventId))
        {
            // load event data, and set data context
        }
    }
    

    编辑

    我猜您可能想暂时保存事件数据,而不是从目标页面上的服务重新加载它。如果是这样,您可以使用隔离存储来保存事件数据。因此,在导航之前,请使用适当的键添加数据:

    IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
    settings["event"] = myEvent;
    settings["eventId"] = eventId;
    

    然后用同样的方法捡起来:

    IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
    if (settings.ContainsKey("event") && (int)settings["eventId"] == eventId)
    {
        var myEvent = (EventServiceReference1.Event)settings["event"];
    }
    

    编辑#2

    正如 AndreiC 所指出的,写入独立存储会占用设备上的空间,因此您应该删除不再需要的所有项目。

    【讨论】:

    • 谢谢你,我会试试这个并回复你:)
    • 谢谢,是的,这种方法对我来说非常有效。这是一种简单易行的方法,也非常有效。我感谢您的帮助。谢谢。
    • @mcgarnagle 这也可以,但是看不到在应用程序存储空间中持久存在的应用程序设置中放置选择的意义...假设用户在使用过程中点击应用程序中有 10 个事件,您在手机上存储了 10 个事件。对我来说,这有点浪费空间,除非你以某种方式清除这个已用空间......将从 Web 服务接收到的整个事件列表存储在本地存储中是另一回事,因为它可以用于下次启动以在从服务器更新事件列表之前显示事件
    • @AndreiC 是的,完全同意。在我的回答中更不用说我有点懒惰了。我进行了编辑,至少解决了在存储中无限制地累积事件的问题。您的答案确实具有不使用任何存储的优势......但我对使用全局静态变量有极端(非理性?)厌恶。
    • 您好,所以给出的第一个方法有效,但仅适用于使用的示例数据,即“eventId”数据。我尝试将其余数据添加到该方法中,但由于某种原因,它似乎不起作用,但我尝试了它。其他数据集不是整数,而是文本字符串。例如事件描述和事件时间。当我尝试时,它通常会卡在最后并说未处理的局部变量。请帮我解决这个问题。谢谢
    【解决方案2】:

    一种简单的方法是将 Event 类型的公共静态属性添加到您的 App 类(将其命名为 SelectedEvent),因此当用户从 ListBox 中选择一个事件时,您可以设置:

    App.SelectedEvent = myevent;
    

    然后在 EventPageTemp.xaml.cs 中,您只需将页面的 DataContext 设置为您的 App.SelectedEvent:

    DataContext = App.SelectedEvent;
    

    在 EventPageTemp 的 xaml 页面中,您只需将接口绑定到 Event 对象的属性。

    【讨论】:

    • 谢谢,我试试看。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 2011-10-29
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多