WPF Combobox不更新ViewModel

时间:2011-09-01 00:04:25

标签: c# wpf mvvm combobox viewmodel

我在WPF中对Combobox有一个非常奇怪的问题。我以前在一个更简单的实现中使用它,并认为我知道它是如何工作的,但显然不是。场景如下......我有三个属于父/子关系的类,我有一个类型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"/>

Combobox正确填充(它绑定到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>

但是这只会在下拉时选择Combobox中的正确项目。我理解这个标记是正确的。

因此,简而言之,当我在Combobox中选择一个项目时,我想更新AnswerViewModel上的IsSelected属性。任何帮助将不胜感激。

如果需要更多信息,请告诉我。

谢谢你, 遮蔽

**更新**

好吧,我想我实际上已经解决了,但是如果有人对此有任何建议或想法,我仍然希望听到它们。

这是我做的,我只改变了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属性绑定到我的ViewModel的IsSelected属性。这似乎可以解决问题。

2 个答案:

答案 0 :(得分:3)

只需删除SelectedValueSelectedValuePath属性,但不是它们的工作方式。 SelectedValuePath表示所选项目的哪个属性是SelectedValue的{​​{1}};如果你说ComboBox是“IsSelected”,那么SelectedValuePath将是SelectedValue,这显然不是你想要的......你对SelectedItem.IsSelected的约束是指不存在的属性(SelectedValue

这应该适合你:

QuestionViewModel.IsSelected

答案 1 :(得分:0)

你尝试过试试:

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