C#MVVM组合框
在XAML中,我有一个组合框定义为:C#MVVM组合框,c#,mvvm,binding,combobox,selecteditem,C#,Mvvm,Binding,Combobox,Selecteditem,在XAML中,我有一个组合框定义为: <ComboBox x:Name="UsernameComboBox" ItemsSource="{Binding Users}" DisplayMemberPath="Username" SelectedItem="{Binding Path=SelectedName, Mode=TwoWay}"/>
<ComboBox x:Name="UsernameComboBox"
ItemsSource="{Binding Users}"
DisplayMemberPath="Username"
SelectedItem="{Binding Path=SelectedName, Mode=TwoWay}"/>
<如何在启动时让我的组合框显示一个选择的项目? 当选择绑定到一个不可观察的集合时,你应该考虑一些。如果绑定到一个可观察的集合而不是一个简单的列表,则更新时间会显著加快
您应该了解如何使用实现该接口的项源,例如集合或使用在视图模型中公开项源。还可以在MVVM的上下文中查看有关的这些信息
我个人更喜欢使用ICollectionView在我的视图模型中公开项目源。Silverlight提供类,WPF提供类
公共ICollectionView用户
{
得到
{
if(_viewModelUsers==null)
{
_viewModelUsers=new PagedCollectionView(_viewModelUsersSource);
}
返回_viewModelUsers;
}
}
私有ICollectionView\u viewModelUsers;
私有ObservableCollection_viewModelUsersSource=新ObservableCollection();
然后,在使用对存储库的调用填充基础源集合后,可以使用设置所选项。我可以看到的一个问题是,每次访问
Users
属性时,都会调用RetrieveUsers()
方法,从而重新运行数据库查询。这将打乱您的SelectedItem
绑定,这将使绑定到组合框的项目列表保持不变。换句话说,它通过计算SelectedItem
与绑定项集合的相等性来查找所选项
您需要查询数据库一次
public YourClassConstructor()
{
_users = _userRepository.RetrieveUsers();
_selectedName = _users[0];
}
public List<User> Users
{
get
{
return _users;
}
}
publicYourClassConstructor()
{
_users=_userRepository.RetrieveUsers();
_selectedName=_用户[0];
}
公共列表用户
{
得到
{
返回用户;
}
}
这也将确保选择第一个项目。集合没有更改,因此这不相关。谢谢。回答得真不错。我特别感谢你指出我一直在查询数据库。至少对于这个应用程序来说,这是非常不必要的。此外,我还将使用“静态”列表了解它将如何影响组合框。再次感谢。没问题-如果这对你有帮助,请投票并标记为答案。这有点极端不管怎样,很高兴它起了作用!
private User _selectedName;
public User SelectedName
{
get
{
return _selectedName;
}
set
{
if (_selectedName == value) return;
_selectedName = value;
OnPropertyChanged("SelectedName");
}
}
public ICollectionView Users
{
get
{
if (_viewModelUsers == null)
{
_viewModelUsers = new PagedCollectionView(_viewModelUsersSource);
}
return _viewModelUsers;
}
}
private ICollectionView _viewModelUsers;
private ObservableCollection<User> _viewModelUsersSource = new ObservableCollection<User>();
public YourClassConstructor()
{
_users = _userRepository.RetrieveUsers();
_selectedName = _users[0];
}
public List<User> Users
{
get
{
return _users;
}
}