2012-03-12 97 views
1

我试图选择一个特定的项目在ListPicker的WP7的selectionchanged事件。我相信我已经正确实现了ListPicker,并且已经将一个文本数组绑定到了ListPicker,但是当尝试在ListPicker中选择一个特定的项目时出现了我的问题。我的ListPicker在我的SettingsPage.xaml中,我想将特定的字符串传递给我的MainPage.xaml对象以供在那里使用。我的代码如下listpicker选择不起作用

SettingsPage.xaml

<phone:PhoneApplicationPage.Resources> 
    <DataTemplate x:Name="SearchProviderItemTemplate"> 
     <TextBlock Text="{Binding SearchProvider}" /> 
    </DataTemplate> 
</phone:PhoneApplicationPage.Resources> 

<!--Pivot Control--> 
    <controls:Pivot Title="QUEST"> 
     <!--Pivot item one--> 
     <controls:PivotItem Header="browser"> 
      <ScrollViewer x:Name="ContentPanel_Browser" Margin="12,0,12,0"> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition/> 
         <ColumnDefinition/> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="70"/> 
         <RowDefinition Height="70"/> 
         <RowDefinition/> 
         <RowDefinition/> 
         <RowDefinition/> 
        </Grid.RowDefinitions> 

        ... 

        <!-- Search Provider --> 
        <TextBlock Text="Search provider" Margin="12,7,12,8" 
         Grid.Row="3" VerticalAlignment="Bottom" 
         Foreground="{StaticResource PhoneSubtleBrush}"/> 
        <toolkit:ListPicker x:Name="SearchProviderListPicker" Grid.Row="4" Grid.ColumnSpan="2" Margin="12,0,12,0" 
             ItemTemplate="{Binding SearchProviderItemTemplate}" 
             SelectionChanged="SearchProviderListPicker_SelectionChanged" /> 
       </Grid> 
      </ScrollViewer>     
      <!--<Grid/>--> 
     </controls:PivotItem> 

SettingsPage.xaml.cs

string searchProvider; 

    String[] SearchProvider = 
    { 
     "Google", 
     "Bing", 
     "Yahoo", 
     "Ask", 
     "AOL" 
    }; 


    private void SearchProviderListPicker_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if(e.AddedItems.Equals("Google")) 
     { 
      searchProvider = "http://www.google.com/search?q="; 
     } 
     else if(e.AddedItems.Equals("Bing")) 
     { 
      searchProvider = "http://www.bing.com/search?q="; 
     } 


     //if (SearchProvider.Equals("Google")) 
     //{ 
     // searchProvider = "http://www.google.com/search?q="; 
     //} 
     //else if(SearchProvider.Equals("Bing")) 
     //{ 
     // searchProvider = "http://www.bing.com/search?q="; 
     //} 

    }   

    public SettingsPage() 
    { 
     InitializeComponent(); 

     this.SearchProviderListPicker.ItemsSource = SearchProvider; 
    } 

    protected override void OnNavigatedFrom(NavigationEventArgs e) 
    { 
     base.OnNavigatedFrom(e); 

     //Send searchProvider to MainPage.xaml 
     if (searchProvider != null) 
     { 
      //this.NavigationService.Navigate(new Uri("/MainPage.xaml?curProvider=" + searchProvider, UriKind.Relative)); 
      NavigationContext.Equals("curProvider=" + searchProvider); 
     }    
    } 

MainPage.xaml.cs中

string _searchProvider; 

//OnNavigatedTo method 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 

     //for Search Provider (from SettingsPage.xaml) 
     NavigationContext.QueryString.TryGetValue("curProvider", out _searchProvider); 


    } 

private void SearchBar_Click(object sender, KeyEventArgs e) 
    { 
     string search; 
     string _search = SearchBar.Text; 
     search = HttpUtility.UrlEncode(_search); 

     //search whats in the searchbar 
     //use inputscope enter key to start search! 
     if (e.Key == Key.Enter) 
     { 
      //check to ensure absolute navigation uri, else search through bing? 
      if (String.IsNullOrEmpty(search)) 
       return; 
      if (search.Equals("about:blank")) 
       return; 

      if (_searchProvider != null) 
      {     
       TheBrowser.Navigate(_searchProvider + search); 
      } 

      //Google 
      //TheBrowser.Navigate("http://www.google.com/search?q=" + search); 

      //Bing 
      //TheBrowser.Navigate("http://www.bing.com/search?q=" + search); 

      //Yahoo 
      //TheBrowser.Navigate("http://search.yahoo.com/search?p=" + search); 

      //Ask 
      //TheBrowser.Navigate("http://www.ask.com/web?q=" + search); 

      //AOL 
      //TheBrowser.Navigate("http://search.aol.com/search?q=" + search); 


      //lose focus of textbox while navigating 
      this.Focus(); 
     } 
    } 

基本上我想通过将选定的ListPicker项目添加到MainPage,以便它可以用作Web浏览器的默认搜索提供程序r控制。关于如何实现这一点的任何想法?任何代码的援助将不胜感激..我真的不确定如何完全正确地完成(截至目前,我没有任何调试或运行时错误,但webbrowser不尝试使用所选的ListPicker项目时搜索)?提前致谢!

+0

'AddedItems'返回所选项目的列表。直接执行'Equals(“somestring”)'是行不通的。你会得到特定的项目对象,并尝试使用比较。 – abhinav 2012-03-12 07:45:07

回答

0

以下将给你选择的项目。


private void SearchProviderListPicker_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     string selectedItem = e.AddedItems[0] as string; //I'm not sure, whether it'll be string. Please check the type of objects in the list. But the logic will be the same. 
     if(selectedItem == "Google") 
     { 
      searchProvider = "http://www.google.com/search?q="; 
     } 
     else if(selectedItem == "Bing") 
     { 
      searchProvider = "http://www.bing.com/search?q="; 
     } 
     //Continue the comparison 

    } 
+0

感谢@Amresh Kumar,我在上面添加了一些代码,我相信它会修复IndexOutOfRangeException。任何想法如何将这个选定的字符串值传递给我的MainPage而没有“导航”? – Matthew 2012-03-13 00:54:36

+0

@Mthethew要传回值,您必须将其传递给查询字符串。或者,您可以使用IsolatedStorageSettings.ApplicationSettings来保存该值。 IsolatedStorageSettings.ApplicationSettings存储K-V对,并可在整个应用程序中访问。 – 2012-03-13 03:52:03

+0

谢谢@Amresh Kumar我使用查询字符串方法,它工作得很好,但我确实意识到,当我选择我想要的提供程序,然后导航回MainPage,如果我选择再次返回到SettingsPage,我的列表框显示第一个提供程序在ListPicker索引中,而不是实际正在使用的索引(例如,我选择了Bing并使用它,但ListPicker仍然表示Google)。你会推荐什么来始终在listpicker中显示当前的提供者? – Matthew 2012-03-14 18:35:59

0
ListPickerItem Item = SearchProviderListPicker.SelectedItem as ListPickerItem; 
string type = Item.Content.ToString(); 

获取项目字符串。