WPF ComboBox自动选择如果只有1项

我有一个combobox,我绑定到一个可观察的集合,它被更改(根据公司选择)和大量的公司将有一个帐户(项目)因此我想知道什么是最好的方式来制作ComboBox如果ItemsSource中只有1个项目,则设置SelectedItem,否则将其保留为null以确保用户选择一个帐户。

我现在这样做的方法是每次更改帐户集时检查帐户集合,如果它只包含一个帐户集合,则将绑定的选定项目属性设置为集合中的第一个项目。

这似乎很长,我需要分别在每个视图模型中实现它,并为每个combobox写入最多5行代码。

以下是我目前的代码,但我想知道是否可以通过扩展ComboBox控件来实现这一目的? 如果有人对如何/从哪里开始有任何想法。

public CompanyGermanPower FromCompany { get { return _fromCompany; } set { SetField(ref _fromCompany, value, () => FromCompany); if(value!= null) { FromTradeAccountList = new ObservableCollection(TradeAccountAdapter.GetTradeAccounts(_session, value.ID)); if (Trade != null && FromTradeAccountList.Count == 1) Trade.TradeAccountFrom = FromTradeAccountList[0]; } } } private CompanyGermanPower _fromCompany; 

创建一个能够满足您需求的附加行为应该相当简单。 要检测ComboBox中的Items集合何时更改,您需要使用此博客文章中提到的技巧。

更新 :这是我的尝试(您需要在项目中添加对System.Windows.Interactivity的引用 – 您可以从Expression Blend SDK获取它):

 using System.Windows.Interactivity; public class SelectFirstItemComboBoxBehavior : Behavior { protected override void OnAttached() { base.OnAttached(); (AssociatedObject.Items as INotifyCollectionChanged).CollectionChanged += HandleCollectionChanged; } protected override void OnDetaching() { base.OnDetaching(); (AssociatedObject.Items as INotifyCollectionChanged).CollectionChanged -= HandleCollectionChanged; } private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (AssociatedObject.Items.Count == 1) { AssociatedObject.SelectedItem = AssociatedObject.Items.Cast().First(); } } } 

这是你如何使用它:

                                        

仅使用XAML:

  

当然,您可能希望为该样式添加一个键,并将其基于ComboBoxes的默认样式,以使其真正有用,但我希望您能理解。