2013-12-17 3 views
0

응용 프로그램 페이지에 ListPicker가 있지만 페이지가로드 될 때 SelectionChanged 이벤트가 여러 번 호출됩니다. 이 문제를 피하기 위해 이전 질문에서 나는 여기 ListPicker SelectionChanged Event Called Multiple Times During Navigation을 물어 봤는데 ThemeListPicker_SelectionChanged를 Datatemplate .. 내에서 부모 Stackpanel로 만드는 대신 제안이 StackPanel에서 stk_Tap이라는 탭 이벤트를 만들고 ' 이 이벤트는 변경된 선택 사항이 호출 될 때마다 호출되지만 선택 이벤트가 변경된 것과 같은 버그가있는 동작을 나타내지 않습니다. 'StackPanel의 탭된 이벤트에서 탭된 항목을 얻는 방법

이제 그에 따라 해결책을 조정했지만 ListPicker의 어느 아이템이 선택되고 있는지, 현재 선택되어 있는지를 판별하는 방법을 모른다. 또한 StackPanel이 항목을 가져올 수 있다고 생각했기 때문에 ListPicker에서 ListPicker SelectionChanged 이벤트를 제거했습니다. 그러나 이것이 올바른지 또는 어떻게 수행 할 것인지 확실하지 않습니다.

XAML

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

<toolkit:ListPicker x:Name="ThemeListPicker" Header="Theme" 
       ItemTemplate="{StaticResource PickerItemTemplate}" 
       SelectionChanged="ThemeListPicker_SelectionChanged"/> 

XAML.CS

private void ThemeListPicker_SelectionChanged(object sender, 
              SelectionChangedEventArgs e) 
{ 
    if(ThemeListPicker.SelectedIndex != -1) 
    { 
     var theme = (sender as ListPicker).SelectedItem; 

     if (index == 0) 
     { 
      Settings.LightTheme.Value = true; 
      MessageBox.Show("light"); 
     } 
     else 
     { 
      Settings.LightTheme.Value = false; 
      MessageBox.Show("dark"); 
     } 
    }        
} 

* 편집 : 나는 코드에서 ListPicker 인 selectionchanged 이벤트를 왼쪽 경우에도,

<phone:PhoneApplicationPage.Resources> 
    <DataTemplate x:Name="PickerItemTemplate"> 
      <StackPanel tap="stk_Tap"> 
       <TextBlock Text="{Binding Name}"/> 
      </StackPanel> 
    </DataTemplate> 
</phone:PhoneApplicationPage.Resources> 

<toolkit:ListPicker x:Name="ThemeListPicker" Header="Theme" 
       ItemTemplate="{StaticResource PickerItemTemplate}" 
       /> 

그래서 내 솔루션을 업데이트하는 방법 수정을 한 뒤에 페이지로드/탐색에 이벤트가 두 번 호출되는 것을 보지 못했습니다. ating to,하지만 현재 선택한 항목을 지금 가져 오는 방법을 모르겠습니까?

EDIT2 **

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

     themeList = new List<TestApp.Common.Theme>(); 
     themeList.Add(new TestApp.Common.Theme() { Name = "Darker", name = "dark" }); 
     themeList.Add(new TestApp.Common.Theme() { Name = "Lighter", name = "light" }); 
     ThemeListPicker.ItemsSource = themeList; 
    } 

private void stk_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     if (ThemeListPicker.SelectedIndex != -1) 
     { 
      //Need to get the current ThemeListPicker's 'name' 
      var selectedItem1 = (sender as StackPanel).DataContext as ListPicker; 

      //use selectedItem1 

     } 
    } 
+0

protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); if (e.NavigationMode != NavigationMode.Back) { // Your code goes here } } 

// 스택 패널 탭 이벤트와 방법을 onNavigatedTo r에 이렇게 수정, 당신은 또한 탭 이벤트와 값 selectedIndex의를 받고있을 수 있습니다. –

답변

0

작품의 같은 종류의 추가 탭 이벤트에 대한 필요가 없습니다. 내가 바로 당신이 OnNavigatedTo 이벤트에 listpicker의 itemssource를 설정 생각하는 경우

private void ThemeListPicker_SelectionChanged(object sender, 
              SelectionChangedEventArgs e) 
{ 
    if(ThemeListPicker.SelectedIndex==-1) 
      return; 
     var theme = (sender as ListPicker).SelectedItem; 
     if (index == 0) 
     { 
      Settings.LightTheme.Value = true; 
      MessageBox.Show("light"); 
     } 
     else 
     { 
      Settings.LightTheme.Value = false; 
      MessageBox.Show("dark"); 
     } 
     ThemeListPicker.SelectedIndex=-1        
} 

ListPicker 인 selectionchanged 이벤트는 위의 문제에 대한 탐색 동안 여러 번 호출합니다. 당신이

private void stack_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
    var selectedIrem = (Cast as your type)(sender as StackPanel).DataContext; 
    } 
+0

좋아, 나는 이것을 확실히 시도 할 것이다. 것은, 나는 MainPage가 있고, 그 때 ThemeListPicker는 MainPage에서 NavigatedTo 인 SettingsPage에있다. 그래서 'e.NavigationMode! = NavigationMode.Back'을 적용 할 수 있습니까? SettingsPage가 NavigateTo 인 경우 ThemeListPicker_SelectionChanged가 두 번 실행되지 않게하려면 어떻게 설정해야할까요? 또한, 다른 옵션은 ThemeListPicker의 ItemsSource를 SettingsPage Loaded 이벤트에 설정하는 것입니까? – Matthew

+0

@Matthew ThemeListPicker의 항목 소스를 설정할 때마다 선택 변경 이벤트가 발생합니다. 그것을 제한 할 수있는 방법이 없습니다. 그래서 나는 다른 이벤트에 대한 작업을하고 선택 변경된 이벤트를 제거 할 것을 제안 할 것입니다. – Jaihind

+0

Ok. 위에서 편집 한 것처럼 ThemeListPicker_SelectionChanged 이벤트를 제거했습니다. StackPanel Tap 이벤트를 사용하여 ListPicker에서 현재 선택된 항목을 가져 오려고 생각했습니다. 내 질문은 정확히 그 StackPanel 탭 이벤트에서 ThemeListPicker에서 현재 선택한 항목을 얻을 수 있습니까? – Matthew

관련 문제