2012-03-12 12 views
1

WP7用ListPickerのselectionchangedイベントで特定の項目を選択しようとしています。私は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項目をメインページに追加して、ウェブブラウジングのデフォルトの検索プロバイダとして使用できるようにしますr制御。これがどのように実装されるかについてのアイデアはありますか?どのようなコードの支援が大いに評価されるだろう..私は本当にこれを正しく達成するためにどのようなデバッグやランタイムエラーはありませんが、Webブラウザは選択した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を修正したと思います。この選択された文字列値をメインページに 'ナビゲート'せずに渡す方法に関するアイデアはありますか? – Matthew

+0

@Matthew値を渡すには、クエリ文字列で渡す必要があります。または、IsolatedStorageSettings.ApplicationSettingsを使用して値を保存することもできます。 IsolatedStorageSettings.ApplicationSettingsにはK-Vペアが格納され、アプリケーション全体でアクセスできます。 –

+0

ありがとう@Amresh Kumar私はクエリ文字列メソッドを使用し、それは素晴らしい動作しますが、私は私が必要とし、MainPageに戻ってナビゲートするプロバイダを選択した後、私は再びSettingsPageに戻って私のリストボックス実際に現在使われているListPickerインデックスの代わりにListPickerインデックスに入れられます(たとえば、Bingを選択して使用されていますが、ListPickerはまだGoogleと言います)。現在のプロバイダを常にlistpickerに表示するために何をお勧めしますか? – Matthew

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

項目の文字列を取得します。