Как установить индекс ListPicker без выполнения события ValueChanged

1

Эта проблема сводила меня с ума. У меня есть ListPicker, который динамически заполняется несколькими элементами. Я разместил объявленный обработчик события SelectionChanged в событии Loaded моей страницы. Когда пользователь нажимает на определенный элемент на странице, видимость ListPicker будет переключаться с Collpased на Visible, и я устанавливаю значения ListPicker. Проблема в том, что индекс ListPicker будет основан на настройках пользователей, поэтому из трех элементов текущий индекс может быть 1, а не 0, как и по умолчанию. Мне нужно показать 1 как текущий элемент в ListPicker без срабатывания события SelectionChanged (который выполняет операции, основанные на текущем индексе). Тогда и только тогда, когда пользователь меняет выделенный элемент, мне нужно, чтобы событие SelectionChanged срабатывало.

Основная причина этого заключается не только в том, что пользователь должен видеть свою текущую настройку в ListPicker, когда она отображается, но и в событиях события SelectionChanged, которые перезаписывают то, что в настоящее время существует, что является чрезвычайно запутанным и не предполагается, пользователь указывает.

То, что у меня сейчас, выглядит следующим образом

XAML

<toolkit:ListPicker x:Name="lp" Visibility="Collapsed" Margin="12" Width="300"/>

XAML.CS

private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        lp.SelectionChanged += lp_SelectionChanged;
    }

void EditableEllipse_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    if (sender != null)
    {
        DependencyObject tappedElement = e.OriginalSource as UIElement;
        // find parent UI element of type PhotoThumbnail
        //PhotoThumbnail i = this.FindParentOfType<PhotoThumbnail>(tappedElement);
        i = this.FindParentOfType<PhotoThumbnail>(tappedElement);
        if (i != null)
        {
            BuildControl(i);
        }
    }
}

private void BuildControl(PhotoThumbnail pp)
    {
        switch(pp.NName)
        {
            case "flip":
                List<ListPickerItem> l = new List<ListPickerItem>();                    
                l.Add(new ListPickerItem { Name = "Flip_Vertical", Content = AppResources.App_Flip_Vertical });
                l.Add(new ListPickerItem { Name = "Flip_Horizontal", Content = AppResources.App_Flip_Horizontal });
                l.Add(new ListPickerItem { Name = "Flip_Both", Content = AppResources.App_Flip_Both });
                lp.ItemsSource = l;  //Code execution jumps from here to ValueChanged event immediately                  
                lp.Visibility = Visibility.Visible;
                lp.SelectedIndex = Settings.Flip.Value - 1;
                break;
        ..
        }
    }

private async void lp_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
            if (lp.SelectedIndex != -1) //always defaults to = 0
            {
                var item = (sender as ListPicker).SelectedItem;
                string name = ((ListPickerItem)item).Name;

                if (name != null)
                {
                        switch (name)
                        {
                            case "Flip_Vertical":
                                Settings.Flip.Value = 1;
                                ..perform process based on current Setting.Flip.Value..                                    break;
                            case "Flip_Horizontal":
                                Settings.Flip.Value = 2;
                                ..perform process based on current Setting.Flip.Value..
                                break;
                            case "Flip_Both":
                                Settings.Flip.Value = 3;
                                ..perform process based on current Setting.Flip.Value..
                                break;

                             ...
                          }
                }
            }
Теги:
xaml
windows-phone-8
listpicker

1 ответ

0
Лучший ответ

Попытайтесь использовать порядок техники (путем отцепления и переустановки события)

private void BuildControl(PhotoThumbnail pp)
{
    switch(pp.NName)
    {
        case "flip":

            // unhook event
            lp.SelectionChanged -= lp_SelectionChanged;

            List<ListPickerItem> l = new List<ListPickerItem>();                    
            l.Add(new ListPickerItem { Name = "Flip_Vertical", Content = AppResources.App_Flip_Vertical });
            l.Add(new ListPickerItem { Name = "Flip_Horizontal", Content = AppResources.App_Flip_Horizontal });
            l.Add(new ListPickerItem { Name = "Flip_Both", Content = AppResources.App_Flip_Both });
            lp.ItemsSource = l;  //Code execution jumps from here to ValueChanged event immediately                  
            lp.Visibility = Visibility.Visible;
            lp.SelectedIndex = Settings.Flip.Value - 1;

            // after setting the index, rehook the event
            lp.SelectionChanged += lp_SelectionChanged;

            break;
    ..
    }
}
  • 0
    Забавно, перед тем как прочитать это как последний вариант, я попробовал то же самое, и это сработало. Вы бы порекомендовали затем удалить lp.SelectionChanged += lp_SelectionChanged из Page_Loaded ?
  • 1
    @ От этого зависит, если у вас есть что-то еще, что вы хотите, чтобы триггер после Page_Loaded, если нет ничего, то это безопасно удалить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню