#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: Я добавил некоторый псевдокод, адаптированный из моего решения. Я надеюсь, что это поможет.