【发布时间】:2013-12-17 14:12:11
【问题描述】:
我在应用程序页面中有一个 ListPicker,但在页面加载时会多次调用 SelectionChanged 事件。为了避免这种情况,我一直在关注我在这里问过的上一个问题ListPicker SelectionChanged Event Called Multiple Times During Navigation,其中建议不是让 ThemeListPicker_SelectionChanged 在数据模板中创建父堆栈面板..',而是在 StackPanel 中创建一个名为 stk_Tap 的点击事件,然后'使用此点击 stk_Tap 执行您的操作,因为每次调用选择更改时也会调用此事件,但它不会表现出像选择更改事件那样的错误行为'
现在我已经相应地调整了我的解决方案,但我不知道如何确定 ListPicker 的哪个项目正在被选中或当前被选中。我还删除了 ListPicker 中的 ListPicker SelectionChanged 事件,因为我认为 StackPanel 可以获取该项目,但我不确定这是否正确或如何执行此操作?
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");
}
}
}
*编辑:我如何更新我的解决方案
<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}"
/>
因此,即使我在进行修改后将 ListPicker SelectionChanged 事件留在代码后面,我也没有看到在页面加载/导航到时调用了两次该事件,但我不确定如何获取当前选择的现在有项目吗?
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
}
}
【问题讨论】:
-
好吧,您可能还会通过点击事件获得值 SelectedIndex。
标签: c# xaml windows-phone-7 windows-phone-8 listpicker