Как вызвать метод UI Controls из ViewModel (MVVM)?

#c# #silverlight #mvvm

#c# #silverlight #mvvm

Вопрос:

Я хочу вызвать AutoComepleteBox s PopulateComplete() из ViewModel как мне это вызвать?

Ответ №1:

Поведение с использованием System.Windows.Интерактивность — отличный способ сделать это.

Взгляните на это — http://julmar.com/blog/mark/?p=34 — в данном случае он использует его для водяного знака, но вы могли бы легко адаптировать поведение… Я часто ссылаюсь на этот пост в блоге в качестве отправной точки.

Главное в поведении — это то, что вы получаете доступ к вещам, которые вы не могли, событиям, к которым вы не можете прикрепить в модели представления, требуется несколько минут, чтобы разобраться в них, но однажды вечером на диване почитайте несколько блогов и MSDN, и вы станете большим поклонником!

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

1. 1 это. Поведение довольно крутое… Хотелось бы, чтобы они были доступны из коробки для WPF, как для Silverlight.

Ответ №2:

Представление должно обрабатывать все, что связано с пользовательским интерфейсом и представлением — в идеале вы должны вызывать PopulateComplete() из самого представления. Основываясь на вашем комментарии к ответу Брэндонзейдера, я бы посоветовал вам создать событие в ViewModel, которое запускается при завершении метода service, и поместить ваш PopulateComplete() вызов в обработчик для этого события в представлении.

Теперь вы можете использовать свою ViewModel где угодно — если что-то должно произойти в представлении после завершения вызова службы, оно может просто подписаться на новое событие.

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

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

Ответ №3:

Есть несколько различных способов добиться этого, это просто зависит от того, что вы пытаетесь сделать … откуда в вашей ViewModel вы пытаетесь вызвать PopulateComplete()? Например, если вы находитесь в экземпляре ICommand, вы можете передать элемент управления в качестве параметра, преобразовать его и вызвать свой метод.

Основываясь на вашем комментарии, я бы подошел к этому немного по-другому. Это потребует некоторого обходного пути из-за ограничений элемента управления.

Добавьте прослушиватель событий к представлению в коде позади, прослушивающий событие изменения коллекции коллекции в вашей модели представления. Затем вы можете вызвать PopulateComplete() в обработчике событий. Для этого вам понадобится ссылка на вашу ViewModel в вашем представлении.

Другим вариантом было бы передать ссылку на AutoComepleteBox в ViewModel при загрузке представления (используя EventTrigger) и сохранить эту ссылку в закрытом поле. Затем, когда ваш вызов веб-службы вернется, используйте эту ссылку для вызова PopulateComplete().

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

1. У меня есть метод service, который загружает список, и этот список я привязал к свойству ItemsSource поля автозаполнения. Теперь в методе service после загрузки каждого элемента в список я хочу вызвать метод AutoCompeleteBox, который отобразит выпадающий список из этого списка;