C#MVVM组合框

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}"/>

在XAML中,我有一个组合框定义为:

<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;
    }
}