在我正在创建的Windows Phone 7.5应用程序中,我遇到了将导航服务绑定到按钮的问题。该按钮位于XAML中的ListBox数据窗口中,该窗口是从JSON反序列化器的代码隐藏中填充的:
void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
{
return;
}
List<JSON> newslistJson = JsonConvert.DeserializeObject<List<JSON>>(e.Result);
this.NewsList.ItemsSource = newslistJson;
}
这里通过上面的代码填充了NewsList列表框,以及包含“getters”和“setters”的类文件。但是,如前所述,在ListBox内部和它的DataTemplate中,有一个按钮:
<Button x:Name="toNewsSite" Grid.Row="1" Content="Read More»" Height="auto" Width="auto" FontSize="19" Foreground="#FFFFFF"/>
此按钮应通过第一个代码片段导航到每个项目的news_id,这是处理公共getter和setter的类文件中的字符串。
所以我的梦想场景是,在代码隐藏中,在webClient_DownloadString ...()中有类似的东西:
toNewsSite.NavigateService = ("TheNewPage.xaml/news?id={0}", JSON.news_id);
Aaand来自那里列表框中的每个新闻项都有一个单独的按钮,其中有一个参数,说明它有哪个news_id,将在“TheNewPage”页面上提取。
这实际上有用吗?
答案 0 :(得分:3)
首先,Button控件没有任何NavigationService。为了导航到新页面,您需要调用NavigationService.Navigate()方法
所以,我要做的是将id绑定到Button的Tag
<Button x:Name="toNewsSite" Grid.Row="1" Click="OnButtonClick" Tag="{Binding news_id}" Content="Read More»" Height="auto" Width="auto" FontSize="19" Foreground="#FFFFFF"/>
private void OnButtonClick(object sender, RoutedEventArgs e)
{
Button bt = (Button)sender;
NavigationService.Navigate(new Uri("TheNewPage.xaml/news?id=" + bt.Tag.ToString(), UriKind.Relative));
}
答案 1 :(得分:1)
在按钮的单击处理程序中,抓取按钮的DataContext,您将能够访问
private void OnButtonClick(object sender, RoutedEventArgs e)
{
JSON item = (sender as FrameworkElement).DataContext;
NavigationService.Navigate(new Uri("TheNewPage.xaml/news?id=" + item.news_id, UriKind.Relative));
}
作为进一步的改进,我不是在ItemTemplate上添加一个按钮,而是处理你在DataTemplate根目录下放置的任何事件(我猜一个Grid或StackPanel)。