Использование флажков для выбора элементов

#silverlight #mvvm

#silverlight #mvvm

Вопрос:

Я создаю приложение silverlight. Мое требование состоит в том, чтобы пользователи выбирали ряд навыков, которые к ним применимы, из большего списка навыков.

Таблицы: Кандидат => Навыки кандидатов; Категории навыков => Умения. Я думаю, что схема говорит сама за себя. Во внешнем интерфейсе будут показаны все навыки (сгруппированные по разным категориям), и когда кандидат войдет в систему, в флажках будут отображаться только выбранные им навыки. Довольно просто.

Мой вопрос: должен ли я перенести все объекты навыков во внешний интерфейс, а затем получить объекты CandidateSkill, перебрать их и соответствующим образом установить флажки или это более простой / лучший способ?

Спасибо

Ответ №1:

Я рекомендую создать класс для использования в качестве ViewModel. Класс должен содержать по крайней мере свойство, указывающее, выбран ли элемент, текст для представления и либо сам объект модели, либо его ключ.

Вы можете создать набор объектов модели представления, соединив набор всех навыков слева с навыками отдельного кандидата и установив IsSelected значение, равное результату ненулевого теста навыка кандидата.

Затем вы можете привязаться непосредственно к ViewModel.

Однажды у меня была похожая ситуация (пользователи получают разрешения, а кандидаты — навыки), и я использовал этот ресурс в качестве отправной точки. Я надеюсь, что это поможет.

В моем случае у меня была кнопка «Сохранить», которая при нажатии запускала некоторый код за кодом для перебора выбранных элементов и отправки их в мой веб-сервис. Не зная подробностей реализации ваших данных и сервиса, я не буду загромождать пост мельчайшими подробностями.

Удачи!

Комментарии для обсуждения

Вот процедура псевдо-LINQ, создающая модели представления путем выполнения двух вызовов базы данных:

 var userskills = database.CandidateSkills
                       .Where(cs => cs.UserId == someUserId)
                       .Select(cs => cs.SkillId)
                       .ToList();
var skills = from s in database.Skills
             select new CandidateSkillViewModel()
             {
                 Text = s.SkillName,
                 IsSelected = userskills.Contains(s.SkillId),
                 Value = s.SkillId
             };
mylist.ItemsSource = skills;
  

Это дало бы вам привязываемый источник данных. В конечном счете, используя этот шаблон, вам придется вручную переводить выделения / отмены в вставки / удаления. Что касается меня, я делаю это в обработчике нажатия кнопки. Я извлекаю новый набор навыков кандидата, перебираю элементы списка и вставляю / удаляю экземпляры CandidateSkill по мере необходимости.

Я понимаю, что в зависимости от нажатия кнопки для преобразования моего состояния viewmodel в операции с базой данных пуристы могут не считать MVVM завершенным, но у меня это сработало.

Я надеюсь, что это поможет немного больше.

Комментарии:

1. Спасибо за совет. Я должен был упомянуть, что я использую MVVM. Меня беспокоило только то, что если я сделаю объединение между CandidateSkills и Skills, я потеряю отслеживание изменений. Вы знаете, так ли это?

2. Возможно, хотя вы могли бы обойти это (частично), внедрив INotifyPropertyChanged в вашу модель представления.

3. ХОРОШО — итак, я получаю коллекцию навыков кандидата (с использованием служб RIA) с уровня обслуживания. В клиентском коде я выполняю левое внешнее объединение с помощью LINQ и создаю новую коллекцию с объединенными навыками и категориями навыков. Нужны ли этим объектам (поиска) также инструкции [Include] на уровне сервиса?

4. Ну, у меня это не сработало. Проблема может заключаться в том, что я уже хочу загрузить Candidate и CandidateSkills и вернуть их в вызове GetCandidates. Оказавшись там, я изо всех сил пытаюсь подключить таблицу навыков к объекту, потому что мои навыки LINQ недостаточно хороши!

5. Привет, @greg: Я добавил некоторый псевдокод, адаптированный из моего решения. Я надеюсь, что это поможет.