C # MVVM Combobox - PullRequest
       33

C # MVVM Combobox

2 голосов
/ 25 мая 2011

В XAML у меня есть поле со списком, определенное как:

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

Правильные пользователи, являющиеся источником элементов для поля со списком.затем в XAML я определил SelectedItem и связал его со свойством Selected name.

В коде это выглядит следующим образом:

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

Как я могу получить в своем комбинированном списке показывать selectedItem при запуске

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Одна проблема, которую я вижу, состоит в том, что каждый раз при обращении к свойству Users вызывается метод RetrieveUsers(), который повторно запускает запрос к вашей базе данных.Это нарушит вашу привязку SelectedItem, в результате чего список элементов, связанных с ComboBox, не изменится.Другими словами, он находит выбранный элемент, оценивая равенство SelectedItem по отношению к совокупности связанных элементов.

Вам необходимо один раз запросить базу данных ...

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

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

Это также обеспечит выбор первого элемента.

0 голосов
/ 25 мая 2011

Есть некоторые последствия для производительности , которые следует учитывать при выборе привязки к ненаблюдаемой коллекции.Время обновления значительно быстрее, если вы привязываете к наблюдаемой коллекции вместо простого списка.

Вам следует взглянуть на использование источника элементов, который реализует интерфейс INotifyCollectionChanged , такой как ObservableCollection {T} или представьте источник ваших элементов в модели представления, используя ICollectionView .Также взгляните на эту информацию о привязке данных в контексте MVVM.

Я лично предпочитаю выставлять источники элементов в моих моделях представления с использованием 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 () для установкивыбранный элемент после заполнения базовой исходной коллекции с помощью вызова вашего хранилища.

...