Wil*_*iam 1 c# wpf combobox mvvm
我一直坚持这个问题好几个小时......我想要做的事实上很简单 - 在ComboBox中设置默认的选定项目(我使用的是MVVM模式).
我在视图中为ComboBox提供了以下XAML:
<ComboBox ItemsSource="{Binding Schools}"
DisplayMemberPath="Acronym"
SelectedValue="{Binding SelectedSchool}"
SelectedValuePath="Id"
/>
Run Code Online (Sandbox Code Playgroud)
在我的ViewModel中,我有一个ObservableCollection,Schools:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
最后,School是一个简单的业务对象:
[DataContract]
public class School
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Acronym { get; set; }
[DataMember]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是,当应用程序启动时,组合框不会获得默认值.我已经尝试在XAML中将SelectedIndex设置为0,但无济于事.我已经尝试在代码隐藏(可以工作)中的Window_Loaded事件处理程序中设置SelectedIndex,但是因为我使用的MVVM模式感觉有点脏.我对这整个WPF/MVVM的东西还是新手,所以如果有人能指出我正确的方向,我将不胜感激.
您可以像这样设置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)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
测试数据:
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" });
Run Code Online (Sandbox Code Playgroud)
并且您将获得所选项目"c".
如果你想使用最小的Id的init ComboBox,你可以使用这个代码:
SelectedSchool = Schools.Min(x => x.Id);
Run Code Online (Sandbox Code Playgroud)
而不是分配常数值.
| 归档时间: |
|
| 查看次数: |
17887 次 |
| 最近记录: |