У меня действительно странная проблема с Combobox в WPF. Я использовал его раньше в более простой реализации и подумал, что знаю, как это работает, но, видимо, нет. Сценарий выглядит следующим образом ... У меня есть три класса, которые находятся в отношениях родитель / потомок, у меня есть список типа AnswerViewModel, который я заполняю в Combobox. Я хочу, чтобы свойство IsSelected в классе было значением, полученным / заданным в Combobox. Ниже приведен фрагмент кода, надеюсь, достаточно, чтобы понять, о чем я говорю.
Это модели.
public class Quiz
{
public string QuizName {get;set;}
public List<Question> Questions {get;set;}
}
public class Question
{
public int QuestionId {get;set;}
public string QuestionText {get;set;}
public List<Answer> {get;set;}
}
public class Answer
{
public int AnswerId {get;set;}
public string AnswerText {get;set;}
public bool IsSelected {get;set;}
}
Это ViewModels
QuizViewModel.cs
// This will create QuestionViewModel for each question.
ObservableCollection<QuestionViewModel> Questions {get;set;}
QuestionViewModel.cs
// This will create AnswerViewModel for each answer
ObservableCollection<AnswerViewModel> Answers {get;set;}
AnswerViewModel.cs
Answer answer;
// ctor
public AnswerViewModel(Answer answer...)
{
this.answer = answer;
...
}
public string AnswerText
{
get { return answer.AnswerText; }
set
{
answer.AnswerText = value;
NotifyPropertyChanged("AnswerText");
}
}
public bool IsSelected
{
get { return _answer.IsSelected; }
set
{
answer.IsSelected = value;
NotifyPropertyChanged("IsSelected"); // <--- Breakpoint
}
}
Это XAML
Quiz.xaml
<ItemsControl ItemsSource="{Binding Questions}" />
Question.xaml
<ComboBox x:Name="answerCombo"
ItemsSource="{Binding Answers}"
DisplayMemberPath="AnswerText"
SelectedValue="{Binding Path=IsSelected}"
SelectedValuePath="IsSelected"/>
Поле со списком заполнено правильно (оно связано с коллекцией AnswerViewModel), но когда я делаю выбор, я ожидаю увидеть в точке останова два события. Один для false для элемента, который больше не выбран, и true для нового выбранного элемента. Но вместо этого он никогда не получит удар.
Так что я рыщу в Интернете в поисках помощи, нашел интересную информацию и попробовал несколько вещей, но пока что, похоже, ничего не закончено. Например:
<ComboBox x:Name="answerCombo"
ItemsSource="{Binding Answers}"
DisplayMemberPath="AnswerText"
SelectedValue="{Binding Path=IsSelected}"
SelectedValuePath="IsSelected">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>
</ComboBox.ItemContainerStyle>
</Combobox>
Но при выборе этого пункта в раскрывающемся списке выбирается только нужный элемент. Как я понимаю, это правильно для этой разметки.
Короче говоря, я хотел бы обновить свойство IsSelected в AnswerViewModel при выборе элемента в комбинированном списке. Любая помощь будет принята с благодарностью.
Если требуется дополнительная информация, просто дайте мне знать.
Спасибо,
Карымский
** Обновление **
Хорошо, я думаю, что на самом деле решил это, но все же, если у кого-то есть предложения или мысли по этому поводу, я все равно хотел бы их услышать.
Вот что я сделал, я только изменил Combobox xaml следующим образом:
<ComboBox x:Name="answerCombo"
ItemsSource="{Binding Answers}"
DisplayMemberPath="AnswerText"
SelectedValue="{Binding Path=ItemsSource/, RelativeSource={RelativeSource Self}}">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>
</ComboBox.ItemContainerStyle>
</Combobox>
В основном это устанавливает selectedvalue для текущего элемента, и так как itemcontainerstyle обрабатывает случай, когда выпадающий список связывает свойство IsSelected комбинированного списка со свойством IsSelected моего ViewModel. И это, кажется, делает свое дело.