2011-05-25 59 views
2

在XAML我有一個組合框定義爲:C#MVVM組合框

<ComboBox x:Name="UsernameComboBox" 
      ItemsSource="{Binding Users}" 
      DisplayMemberPath="Username" 
      SelectedItem="{Binding Path=SelectedName, Mode=TwoWay}"/> 

眼下,它不顯示任何默認選定的項目。

我填的是組合框的列表:

public List<User> Users 
{ 
    get 
    { 
     return _userRepository.RetrieveUsers(); 
    } 
} 

public List<User> RetrieveUsers() 
{ 
    _users = (from Users in _db.Users select Users).ToList(); 

    return _users; 
} 

正確的用戶作爲的ItemSource的組合框。然後在XAML中定義SelectedItem並將其綁定到名爲Selected name的屬性。

在代碼中,這看起來像:

private User _selectedName; 
    public User SelectedName 
    { 
     get 
     { 
      return _selectedName; 
     } 
     set 
     { 
      if (_selectedName == value) return; 
      _selectedName = value; 
      OnPropertyChanged("SelectedName"); 
     } 
    } 

我怎樣才能得到我的組合框顯示在啓動時將selectedItem?

回答

2

我可以看到的一個問題是,每次訪問Users屬性時,都會調用RetrieveUsers()方法,該方法會重新運行數據庫查詢。這將打亂您的SelectedItem綁定,這會預計綁定到ComboBox的項目列表保持不變。換句話說,它通過評估SelectedItem與綁定項目的集合的相等性來找到所選項目。

您需要查詢數據庫一次...

public YourClassConstructor() 
{ 
    _users = _userRepository.RetrieveUsers(); 
    _selectedName = _users[0]; 
} 

public List<User> Users 
{ 
    get 
    { 
     return _users; 
    } 
} 

這也將確保第一項被選中。

+0

謝謝。確實非常好的答案。我特別感謝你指出我一直在查詢數據庫。至少這個應用程序是非常不需要的。我也會看到它會如何影響使用「靜態」列表的組合框。再次感謝。 – 2011-05-25 15:05:20

+0

沒問題 - 如果這對您有幫助,請註冊並標記爲答案。 – ColinE 2011-05-25 15:14:43

+0

完成。解決方案像魅力一樣工作。我可以死一個快樂的人。 – 2011-05-25 15:23:08

-1

有一些performance implications你應該考慮當選擇綁定到一個不可觀察的集合。如果綁定到可觀察集合而不是簡單列表,則更新時間將顯着加快。

您應該看看如何使用實現INotifyCollectionChanged界面的項目源(例如ObservableCollection{T}集合),或者使用ICollectionView將您的項目源展示在您的視圖模型中。在MVVM的上下文中,還可以查看關於Data Binding的信息。

我個人更喜歡使用ICollectionView在我的視圖模型中公開項目源。 Silverlight提供了PagedCollectionView類,而WPF提供了ListCollectionView類。

public ICollectionView Users 
{ 
    get 
    { 
     if (_viewModelUsers == null) 
     { 
      _viewModelUsers = new PagedCollectionView(_viewModelUsersSource); 
     } 
     return _viewModelUsers; 
    } 
} 
private ICollectionView _viewModelUsers; 
private ObservableCollection<User> _viewModelUsersSource = new ObservableCollection<User>(); 

然後可以使用MoveCurrentToFirst()使用填充了資料庫的調用底層的源收集後所選擇的項目設置。

+0

集合沒有改變,所以這不相關。 – ColinE 2011-05-25 14:59:47