Как я могу построить пользовательский интерфейс на лету в моей модели представления - PullRequest
3 голосов
/ 09 февраля 2011

Я полностью принял шаблон MVVM для нашего приложения silverlight. Тем не менее, некоторые из наших пользовательских интерфейсов управляются данными. В основном два предмета ...

  1. Меню. Мы используем Infragistics XamMenu.

  2. У нас есть «панель управления», которая позволяет пользователям добавлять «оснастки». Это что-то вроде сайта портала, такого как iGoogle.

В обоих случаях выше пользовательский интерфейс должен быть построен во время выполнения. В настоящее время я выполняю код в коде позади, потому что я не вижу простого способа доступа к дереву пользовательского интерфейса во ViewModel.

Для запуска кода в представлении я создал событие во ViewModel, которое срабатывает после загрузки данных. Итак, я должен добавить ссылку на viewmodel в коде представления позади. Мне это не нравится, и это очень уродливо ... так что в основном два вопроса:

  1. Как я могу получить представление, получающее сообщение от модели представления, что данные загружаются без получения прямой ссылки на модель представления в коде представления позади? В настоящее время я извлекаю ссылку из контекста данных.

  2. Возможно ли построить пользовательский интерфейс в модели представления и использовать привязку данных. Мне было интересно, смогу ли я связать "content" contentcontrol с каким-то типом (не уверен, каким будет тип) в viewmodel? Конечно, плохая часть этого в том, что тестируемость модели представлений, похоже, исчезает. Можно ли использовать привязку таким образом?

1 Ответ

2 голосов
/ 10 февраля 2011

Чтобы ответить на вопрос 1, почему вы не используете класс MVVM light "Messenger".

По вашему мнению, вы регистрируетесь для прослушивания сообщения следующим образом:

Messenger.Default.Register<bool>(this, "MessageId", DoSomething);

Где DoSomething - метод, который принимает логический параметр (например).

Затем, чтобы отправить сообщение из вашей модели представления, вы делаете следующее:

 Messenger.Default.Send(false, "MessageId");

Надеюсь, это поможет :) Вам нужно будет добавить это к вашему использованию:

using GalaSoft.MvvmLight.Messaging;
...