WPF Combobox не обновляет ViewModel - PullRequest
       14

WPF Combobox не обновляет ViewModel

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

У меня действительно странная проблема с 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. И это, кажется, делает свое дело.

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Просто удалите свойства SelectedValue и SelectedValuePath, это не то, как они работают.SelectedValuePath указывает, какое свойство выбранного элемента будет SelectedValue из ComboBox;если вы говорите, что SelectedValuePath - это "IsSelected", SelectedValue будет SelectedItem.IsSelected, что явно не то, что вы хотите ... А ваша привязка для SelectedValue относится к несуществующему свойству (QuestionViewModel.IsSelected)

Это должно работать для вас:

<ComboBox x:Name="answerCombo"
    ItemsSource="{Binding Answers}"
    DisplayMemberPath="AnswerText">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
        </Style>
    </ComboBox.ItemContainerStyle>
</Combobox>
0 голосов
/ 01 сентября 2011

Вы пробовали:

<ComboBox x:Name="answerCombo"
    ItemsSource="{Binding Answers}"
    DisplayMemberPath="AnswerText"
    SelectedValue="{Binding IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
    SelectedValuePath="IsSelected"/>
...