Как реализовать поиск? - PullRequest
0 голосов
/ 14 ноября 2011

Я пытаюсь внедрить MVVM в новый проект (на основе WPF & Prism), в котором почти на каждом экране (представлении) сначала будет отображаться экран поиска, где пользователь может выбрать добавление / редактирование записей.

Экран поиска принимает ссылку на виртуальную машину, которая реализует один из моих интерфейсов ISearchProvider (который имеет один метод IEnumerable Search (строковые критерии)).

Если этот метод поиска возвращает

  1. набор виртуальных машин (с правильно установленными моделями), которые будут отображаться в сетке на экране поиска или
  2. просто Модели, чтобы при выборе пользователем для редактирования записи (Модель), выбранная модель быладанный экземпляр ВМ, который затем редактируется или
  3. какой-то третий вариант?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Все, что вы планируете показать пользователю, должно быть обернуто в View Model.

Вы упомянули, что пользователь выберет модель для редактирования .Это должно быть просмотр модели ;пользователь выберет модель (сущность) для редактирования, но то, что он будет показан (или то, что увидит ваш вид), должно быть списком моделей представлений, представляющих некоторую сущность.Пользователю (или в данном случае представлении) не требуется никаких знаний о реальной модели.

Теперь модель представления не должна выполнять какой-либо сам поиск .Он должен делегировать поиск в компонент, ответственность за который заключается в том, чтобы выполнить поиск и вернуть результат (будь то DAO, ваш пользовательский инструмент - параметры могут отличаться).Более того, та же модель представления также должна отвечать за «подачу» представления с данными, которые могут или не могут поступить из поиска.

Чтобы привести пример кода:

public class UserListViewModel : ISearchProvider
{
    private IUserFinder userFinder;

    public UserListViewModel(IUserFinder userFinder)
    {
        this.userFinder = userFinder;
    }

    public ObservableCollection<UserViewModel> Users { get; private set; }

    public void Search(string criteria)
    {
        var users = this.userFinder.Search(criteria);
        // rebuild users collection - view will get notified of any changes
        // made to .Users property as it is ObservableCollection
    }
}

Также, возможно, хорошей идеей будет сделать так, чтобы интерфейс ISearchProvider выставлял одну Search команду .Таким образом, привязка из вида действительно проста.

Подводя итог, 2 простых момента:

  • убедитесь, что ваша логика поиска не в модели представления;пусть модель представления делегирует поиск
  • , чтобы результаты поиска были частью модели представления или фактических объектов модели представления (чтобы вы могли "подавать" их для удобного просмотра)
1 голос
/ 14 ноября 2011

Я предпочитаю показывать ViewModels в сетке, особенно если у вас есть класс ViewModelBase с DisplayName, который реализует INPC и IDataErrorInfo.Редко когда моя Модель идеально отражает всю семантику презентации, а виртуальная машина - это то, как мы разделяем эти проблемы.

HTH,
Berryl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...