[Siverlight入门系列]MVVM模式下如何让下拉框ComboBox默认选中第一项

非MVVM方式也就是CodeBehind的模式我就不说了,很简单就是加载完毕事件处理里面加上this.ComboBox1.SelectedIndex=0即可。但MVVM模式下,就不那么方便了,需要绑定SelectedItem,例如:

   1:  
   2: <ComboBox ItemsSource="{Binding Months}" 
   3:     SelectedItem="{Binding Month, Mode=TwoWay}" />
   4:  
   5:  

似乎可行,但如果是默认加载第一项的话,这个SelectedItem就应该是绑定源更新以后的ItemSource.FirstOrDefault(),为何要双向绑定呢?有一点不太爽。有没有其它办法呢?很简单,继承ComboBox,写一个控件,让它默认选中第一项,就解决这个问题了,不用绑定SelectedItem。

   1:  
   2: <ComboBox ItemsSource="{Binding Months}" />
   3:  
   4:  

自定义ComboBox控件代码如下,也非常简单,思路就是ItemSource更新以后就自动默认选中第一行即可:

   1: public class CustomComboBox : ComboBox
   2: {
   3:     /// <summary>
   4:     /// Initializes a new instance of the <see cref="CustomComboBox"/> class.
   5:     /// </summary>
   6:     public CustomComboBox()
   7:     {
   8:         Loaded += ComboBoxLoaded;
   9:         SelectionChanged += ComboBoxSelectionChanged;
  10:     }
  11:  
  12:     void ComboBoxLoaded(object sender, RoutedEventArgs e)
  13:     {
  14:         SetSelectedItem();
  15:     }
  16:  
  17:     void ComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
  18:     {
  19:         SelectedItem = e.AddedItems.Count > 0 ? e.AddedItems[0] : null;
  20:     }
  21:  
  22:     public new object SelectedItem
  23:     {
  24:         get { return (object)GetValue(SelectedItemProperty); }
  25:         set { SetValue(SelectedItemProperty, value); }
  26:     }
  27:     
  28:     public new static readonly DependencyProperty SelectedItemProperty =
  29:         DependencyProperty.Register("SelectedItem", typeof(object), typeof(CustomComboBox),
  30:         new PropertyMetadata((o, e) => ((CustomComboBox)o).SetSelectedItem()));
  31:  
  32:     private void SetSelectedItem()
  33:     {
  34:         if (Items.Count > 0)
  35:             base.SelectedIndex = 0;
  36:  
  37:         //var value = SelectedItem;
  38:         //if (Items.Count > 0 && value != null)
  39:         //{
  40:         //    base.SelectedIndex = Items.IndexOf(value);
  41:         //}
  42:     }
  43:  
  44:     protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  45:     {
  46:         base.OnItemsChanged(e);
  47:         SetSelectedItem();
  48:     }
  49: }

如果你觉得代码好用就拿过去,否则请分享更好的代码。

posted on 2011-10-09 15:17 Mainz 阅读(579) 评论(5) 编辑 收藏

导航

公告

统计