Silverlight SelectedIndex не правильно связывает данные - PullRequest
1 голос
/ 09 сентября 2011

У меня есть уникальное поведение, которое я хочу сделать.

У меня есть комбинированный список, который привязан к списку элементов модели представления.Первый элемент - «[Выбрать элемент]».Ожидаемое поведение: когда пользователь выбирает элемент, я что-то сделаю, затем верну индекс обратно к первому элементу.

Это работает, за исключением того факта, что если вы хотите выбрать третий элемент,2 раза подряд.Вот код: ItemViewModel:

// NOTE, I have all the INotify goo actually implemented, this is the shorthand
// without goo to make it more readable.
public class ItemViewModel : INotifyPropertyChanged
{
  public string Caption { get; set; }
  public string Test { get; set; }
}

ViewModel: (все мои свойства вызывают OnPropertyChanged в наборе соответствующим образом)

public class ViewModel : INotifyPropertyChanged
{
  public ObservableCollection<ItemViewModel> ChildItems { get; set; }
  public int SelectedChildIndex { get; set; }
  public string DebugOutText { get; set; }

  public ViewModel()
  {
    ChildItems = new ObservableCollection<ItemViewModel>();
    SelectedChildIndex = -1;
    DebugOutText = string.Empty;
  }
  public void LoadChildItems()
  {
    ChildItems.Add(new ItemViewModel { Caption = "[ Select Item ]" });
    ChildItems.Add(new ItemViewModel { Caption = "One", Test = "Item 1" });
    ChildItems.Add(new ItemViewModel { Caption = "Two", Test = "Item 2" });
    ChildItems.Add(new ItemViewModel { Caption = "Three", Test = "Item 3" });
    SelectedChildIndex = 0;
  }
  private void OnPropertyChanged(string propName)
  {
    if (propName == "SelectedChildIndex") { this.OnSelectedChildIndexChanged(); }
    if (this.PropertyChanged != null)
    { this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); }
  }
  public void OnSelectedChildIndexChanged()
  {
    if (SelectedChildIndex <= 0) return;
    DebugOutText += "\r\n" + ChildItems[SelectedChildIndex].Test;
    SelectedChildIndex = 0; // <- BIG ISSUE HERE
  }
}

Теперь мой xaml:

<StackPanel HorizontalAlignment="Left">
  <ComboBox Width="200" x:Name="combo"
            ItemsSource="{Binding Path=ChildItems}"
            SelectedIndex="{Binding Path=SelectedChildIndex, Mode=TwoWay}"
            DisplayMemberPath="Caption" />
  <TextBlock Text="{Binding Path=DebugOutText}"/>
</StackPanel>

Наконец, мой запуск приложения:

var vm = new ViewModel();
vm.LoadChildItems();
this.RootVisual = new MainPage { DataContext = vm };

Шаги репо:

  • Запустите его
  • Выберите комбо и нажмите / выберите «Два».
  • Теперь нажмите комбо.Визуальный стиль покажет, что «Два» выделено («[Выбрать элемент]» должно быть выделено).Если вы нажмете / выберете «Два», ничего не произойдет.

Я пошел и поставил некоторый код трассировки, SelectedIndex для комбо - 0, ViewModel.SelectedChildIndex - 0, а для SelectionChanged комбо.не сработает, если я не выберу что-то другое.

Я не совсем уверен, как заставить это работать.Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 10 сентября 2011

Я должен признать, что у меня есть сомнения относительно юзабилити поведения, которое вы хотите.Тем не менее, если вам нужно использовать комбинированный список для этой цели, попробуйте заменить строку

    SelectedChildIndex = 0;

на

    Deployment.Current.Dispatcher.BeginInvoke(() => SelectedChildIndex = 0);
0 голосов
/ 09 сентября 2011

Собираюсь сделать дикое предположение здесь. :)

// NOTE, I have all the INotify goo actually implemented, this is the shorthand 
// without goo to make it more readable.

Вы не показываете свою реализацию INotifyPropertyChanged. Большинство реализаций делают что-то вроде:

public int SelectedChildIndex 
{
    get
    {
        return _selectedChildIndex;
    }
    set
    {
        if (value == _selectedChildIndex) return;
        _selectedChildIndex= value;
        OnProperyChanged("SelectedChildIndex ");
    }
}

Какие замыкает уведомление, если значение свойства не изменяется. Если ваш код выглядит так, выньте оператор «if» и посмотрите, исправит ли он это.

...