2011-09-01 101 views
1

我对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属性。这看起来有诀窍。

回答

3

只需卸下SelectedValueSelectedValuePath性质,这不是他们的工作。 SelectedValuePath指示哪个所选项目的属性将是ComboBoxSelectedValue;如果你说的是SelectedValuePath“IsSelected”,该SelectedValueSelectedItem.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

呵呵,我刚刚完成我的更新,然后发现你的答案。你是对的。我不知道为什么我想的SelectedValue将被捆绑到AnswerViewModel.IsSelected。我只有一个变化是对的SelectedValue设置为当前的项目,这种方式有一个选择(从保存的实例填充时等),如果我将它设置的值。非常感谢您的回复。 – Obscured

0

有尝试:

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