我對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