【问题标题】:WPF Combobox not updating ViewModelWPF 组合框不更新 ViewModel
【发布时间】: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


    【解决方案1】:

    你试过了吗:

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

    【讨论】:

      【解决方案2】:

      只需删除SelectedValueSelectedValuePath 属性,这不是它们的工作方式。 SelectedValuePath 表示选中项的哪个属性将是ComboBoxSelectedValue;如果您说SelectedValuePath 是“IsSelected”,则SelectedValue 将是SelectedItem.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>
      

      【讨论】:

      • 呵呵,我刚更新完,才注意到你的回答。你说的对。我不知道为什么我认为 SelectedValue 会与 AnswerViewModel.IsSelected 相关联。我所做的一项更改是将 SelectedValue 设置为当前项目,这样如果我有一个选择(例如从保存的实例填充时),它将设置该值。非常感谢您的回复。
      猜你喜欢
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多