У меня есть уникальное поведение, которое я хочу сделать.
У меня есть комбинированный список, который привязан к списку элементов модели представления.Первый элемент - «[Выбрать элемент]».Ожидаемое поведение: когда пользователь выбирает элемент, я что-то сделаю, затем верну индекс обратно к первому элементу.
Это работает, за исключением того факта, что если вы хотите выбрать третий элемент,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 комбо.не сработает, если я не выберу что-то другое.
Я не совсем уверен, как заставить это работать.Любая помощь будет оценена.