2012-12-09 25 views
1

我一直坚持这个问题几个小时...我想要做的其实很简单 - 在ComboBox中设置一个默认选定的项目(我正在使用MVVM模式)。在WPF MVVM应用程序的组合框中设置一个默认的选定项目

我已经在我看来,组合框下面的XAML代码:

<ComboBox ItemsSource="{Binding Schools}" 
      DisplayMemberPath="Acronym" 
      SelectedValue="{Binding SelectedSchool}" 
      SelectedValuePath="Id" 
/> 

在我的ViewModel,我有一个ObservableCollection,学校:

public ObservableCollection<School> Schools { get; private set; } 

    public CourseFormViewModel() 
    { 
     Schools = new ObservableCollection<School>(); 

     try 
     { 
      // Gets schools from a web service and adds them to the Schools ObservableCollection 
      PopulateSchools(); 
     } 
     catch (Exception ex) 
     { 
      // ... 
     } 
    } 

    public int SelectedSchool 
    { 
     get { return schoolId; } 
     set 
     { 
      schoolId = value; 
      OnPropertyChanged("SelectedSchool"); 
     } 
    } 

最后,学校是一个简单的业务对象:

[DataContract] 
public class School 
{ 
    [DataMember] 
    public int Id { get; set; } 
    [DataMember] 
    public string Acronym { get; set; } 
    [DataMember] 
    public string Name { get; set; } 
} 

问题是,当应用程序启动时,组合框没有得到一个默认值。我已经尝试在XAML中将SelectedIndex设置为0,但无济于事。我已经尝试在代码隐藏(其工作)中的Window_Loaded事件处理程序中设置SelectedIndex,但由于我使用MVVM模式,感觉有点脏。我对这整个WPF/MVVM的东西还是一个新的东西,所以如果有人能指出我正确的方向,我会很感激。

+0

'学校'是'学校'类型的,而'SelectedSchool'是'int'类型的?可能这是你的问题? – GameScripting

+0

嗯,我改变了SelectedSchool属性返回学校,而不是int,但它没有任何区别。我需要改变什么吗? – William

+0

嗯,唯一可能出错的是...... SelectedSchool是'Schools'集合的一部分?如果没有,那么你必须自己做更多的研究。 – GameScripting

回答

4

您可以设置SelectedSchool这样的:

public void CourseFormViewModel() 
    { 
     Schools = new ObservableCollection<School>(); 

     try 
     { 
      // Gets schools from a web service and adds them to the Schools ObservableCollection 
      PopulateSchools(); 

      SelectedSchool = 3; 
     } 
     catch (Exception ex) 
     { 
      // ... 
     } 
    } 

测试数据:

Schools.Add(new School { Id = 1, Name = "aaa", Acronym = "a" }); 
Schools.Add(new School { Id = 2, Name = "bbb", Acronym = "b" }); 
Schools.Add(new School { Id = 3, Name = "ccc", Acronym = "c" }); 

,您将获得所选项目 “C”。

如果你想用最小的编号初始化组合框,你可以使用此代码:

SelectedSchool = Schools.Min(x => x.Id); 

而不是分配恒定值。

相关问题