[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: }
如果你觉得代码好用就拿过去,否则请分享更好的代码。
