我在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属性。这似乎可以解决问题。
答案 0 :(得分:3)
只需删除SelectedValue
和SelectedValuePath
属性,但不是它们的工作方式。 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"/>