【发布时间】:2011-11-08 01:20:40
【问题描述】:
我对 WPF 中的 Combobox 有一个非常奇怪的问题。我以前在一个更简单的实现中使用过它,并认为我知道它是如何工作的,但显然不是。场景如下......我有三个处于父/子关系中的类,我有一个 AnswerViewModel 类型的列表,我将其填充在 Combobox 中。我希望类上的 IsSelected 属性是在组合框中获取/设置的值。下面是一些代码,希望足以看到我所指的内容。
这些是模型。
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;}
}
这些是视图模型
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
测验.xaml
<ItemsControl ItemsSource="{Binding Questions}" />
问题.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>
但这只会在下拉时选择组合框中的正确项目。我理解这个标记是正确的。
因此,简而言之,当我在组合框中选择一个项目时,我希望更新 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 属性。这似乎可以解决问题。
【问题讨论】:
标签: c# wpf mvvm combobox viewmodel