2012-03-12 3 views
1

Я пытаюсь выбрать конкретный элемент в событии selectionBanged для ListPicker для WP7. Я считаю, что я правильно реализовал ListPicker и связал массив текста с ListPicker, но моя проблема возникает при попытке выбрать конкретный элемент в ListPicker. Мой ListPicker находится в моем SettingsPage.xaml, и я хотел бы передать определенную строку моему объекту MainPage.xaml для использования там. Мой код выглядит следующим образомlistpicker selectionchanged not working

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, чтобы он мог использоваться как поставщик поиска по умолчанию для веб-просмотра r. Любые идеи о том, как это можно реализовать? Любая помощь по использованию кода будет очень благодарна. Я действительно не знаю, как это сделать правильно (на данный момент у меня нет ошибок отладки или времени выполнения, но веб-браузер не ищет при попытке использовать выбранный элемент ListPicker)? Заранее спасибо!

+0

'AddedItems' возвращает список выбранных элементов. Выполнение прямого 'Equals (" somestring ")' не будет работать. Вы получите конкретный объект объекта, и они попытаются использовать сравнение. – abhinav

ответ

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

+0

@Matthew Чтобы передать значение, вы должны передать его в строке запроса. Или вы можете использовать IsolStorageSettings.ApplicationSettings для сохранения значения. Узел IsolStorageSettings.ApplicationSettings хранит пары K-V и может быть доступен во всем приложении. –

+0

Спасибо @Amresh Kumar Я использовал метод строки запроса, и он отлично работает, но я понял, что после того, как я выберу провайдера, которого я хочу, а затем вернусь к MainPage, если я снова вернусь к настройкам, мой список отобразит первого провайдера в списке ListPicker вместо того, который используется на самом деле (например, я выбрал Bing, и он используется, но ListPicker все еще говорит Google). Что бы вы порекомендовали как всегда отображать текущего провайдера в listpicker? – Matthew

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

Получает строку элемента.