我对WPF中的Combobox有一个很奇怪的问题。我之前已经用它来实现一个简单的实现,并且认为我知道它是如何工作的,但显然不是。场景如下...我有三个父/子关系的类,我有一个类型为AnswerViewModel的列表,我在Combobox中进行填充。我希望该类的IsSelected属性是在Combobox中获取/设置的值。下面是一些代码,希望能够看到我指的是什么。WPF Combobox没有更新ViewModel
这些是模型。
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
}
}
这些是XAMLs
Quiz.xaml
<ItemsControl ItemsSource="{Binding Questions}" />
Question.xaml
<ComboBox x:Name="answerCombo"
ItemsSource="{Binding Answers}"
DisplayMemberPath="AnswerText"
SelectedValue="{Binding Path=IsSelected}"
SelectedValuePath="IsSelected"/>
组合框正确填充(它势必AnswerViewModel的集),但是当我做出选择时,我期望在断点处看到的是两个TS。一个用于不再选择该项目上的虚假,并且对于所选新项目为真。但相反,它永远不会被击中。
因此,我在网上寻找帮助,发现了一些有趣的信息,并尝试了一些东西,但迄今为止似乎没有完成。例如:
<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中的正确项目。我知道这个标记是正确的。
因此,简而言之,我希望在组合框中选择一个项目时更新AnswerViewModel上的IsSelected属性。任何帮助将不胜感激。
如果需要更多信息,请告诉我。
谢谢 遮蔽
** **更新
好吧,我想我其实解决它,但还是如果任何人有意见,或者对这个想法,我还是想听听他们。
这是我做什么,我只是改变了组合框的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属性。这看起来有诀窍。
呵呵,我刚刚完成我的更新,然后发现你的答案。你是对的。我不知道为什么我想的SelectedValue将被捆绑到AnswerViewModel.IsSelected。我只有一个变化是对的SelectedValue设置为当前的项目,这种方式有一个选择(从保存的实例填充时等),如果我将它设置的值。非常感谢您的回复。 – Obscured