2011-09-01 96 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"/>