【问题标题】:WPF ComboBox - how to maintain selection when source collection changed?WPF ComboBox - 源集合更改时如何保持选择?
【发布时间】:2011-05-16 07:49:17
【问题描述】:

如果当前选定的项目在 ItemsSource 集合中被替换,我如何保持对组合框的选择?在这种情况下,集合是 ObservableCollection,当然如果当前选定的项目被替换,组合框将失去其选择 - 没有任何选择。

组合框看起来像:

                        <ComboBox 
                            Name="combobox"
                            SelectedValuePath="Id" 
                            DisplayMemberPath="Description" 
                            SelectedValue="{Binding Source={StaticResource cvs}, Path=Id, Mode=TwoWay}"/>

我不能简单地每次手动设置组合框上的选定项,因为集合是在另一个我无法触及的通用类中操作的!

谢谢!

【问题讨论】:

  • 保持选择的标准是什么?索引?
  • 该项目只被替换而不是被删除 - 我不想改变选择
  • 当您替换一个项目时,旧项目被删除并添加新项目。因此,先前选择的项目不再出现在集合中。在它的位置,有一个新项目。您希望选择该新项目吗?如果是这样,请向我们显示您替换该项目的代码。
  • @Daniel 是的,这就是正在发生的事情,是的,我确实希望选择新项目,代码并不特殊,就像:myCollection.Remove(oldItem); myCollection.Add(newItem);

标签: wpf mvvm binding


【解决方案1】:

您将 selectedVaule 绑定到您的 Id 属性。因此,如果您希望新添加的项目成为选定的项目,只需将您的 Id 属性设置为新项目并调用 OnPropertyChanged("Id")

myCollection.Remove(oldItem);
myCollection.Add(newItem);
Id = newItem;
OnPropertyChanged("Id")

【讨论】:

  • 我同意blindmeis,所选项目应该是您的视图模型的一部分,并且应该处理属性更改/集合更改事件。
  • 是的,问题是我无法从操作数据集合的代码中看到我的组合框——虽然我可以公开它违反我们的设计原则——但我们需要将数据操作与用户界面。
【解决方案2】:

使用此代码选择新项目:

combobox.SelectedItem = newItem;

更新:
如果combobox 对替换项目的代码部分未知,则需要执行以下操作:

  • 订阅您收藏的CollectionChanged 活动。
  • 当触发事件并表示添加了新项目时,执行如上所示的代码。

【讨论】:

  • 问题是替换项目的逻辑与 UI 是分开的 - 我看不到像操作源集合的组合框之类的东西
  • 我想我必须订阅 CollectionChanged - 但我不知道添加是来自当前被替换的项目还是其他原因..
猜你喜欢
  • 2013-03-03
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多