Ответ 1
Я бы создал ViewModel, который будет выступать в роли родителя для всех ViewModels проекта. (Позвольте назвать это Решение)
Решение ViewModel будет иметь свойство ActiveProject и наблюдаемую коллекцию проектов.
Как мне обмениваться данными между несколькими ViewModels?
Например, есть класс с именем Project в приложении.
public class Project : ModelBase
{
private string _projectName;
public string ProjectName
{
get { return _projectName; }
set
{
_projectName = value;
RaisePropertyChanged(() => ProjectName);
}
}
}
В нескольких приложениях ViewModels необходимо открыть ActiveProject.
Какой лучший способ поделиться проектом между ViewModels?
Я использовал Messaging раньше, но для этого нужно много трещин. Для всех ViewModels я должен создать свойство ActiveProject, а также зарегистрировать мессенджер, чтобы обновить его.
Я использую среду MVVM Light.
Любой пример кода будет оценен.
Я бы создал ViewModel, который будет выступать в роли родителя для всех ViewModels проекта. (Позвольте назвать это Решение)
Решение ViewModel будет иметь свойство ActiveProject и наблюдаемую коллекцию проектов.
Я бы рекомендовал шаблон посредника. Я использовал EventAggregator для этого типа обмена сообщениями между VM раньше, и на самом деле это не так много.
У вас может быть статическая коллекция, которую ваша модель представления заполняет, прежде чем перейти к новой модели представления. Модель целевого представления может затем извлечь данные из этого конструктора.
Например, ViewModel1 (VM1) создаст проект и заполнит его. Затем VM1 помещает проект в осколок, статическую, коллекцию. Затем VM1 перейдет к другой модели представления (VM2). В конструкторе VM2 вы должны перейти к коллекции и получить проект, размещенный там VM1.
Если вы использовали словарь пар ключ-значение, он также позволит вам делиться другими данными между моделями просмотров.
Синглтон определенно поможет. Для реализации, если бы у меня был класс с именем User:
private static User mInstance;
private User () //constructor
{
}
public static User Instance
{
get
{
if (mInstance == null)
mInstance = new User();
return mInstance;
}
}
Не надо, не надо. Не используйте синглтоны таким образом в своем приложении MVVM. На самом деле класс Project должен быть моделью для ваших ViewModels. Просто передайте его в конструкторе vm. Если вам действительно нужно разделить один экземпляр класса Project в нескольких виртуальных машинах, то при создании моделей просмотра используйте фабрики и кеширование определенного типа. Если ваш vm требует дополнительную информацию, просто создайте специальный класс Model, который будет выводиться из Project (или реализует IProject), поэтому вы можете легко использовать принцип сегрегации интерфейса.