Чтение VM-свойства за пределами VM

264
20 апреля 2017, 13:55

Имеется класс Action, который представляет собой некое действие. Это действие также может содержать коллекцию вложенных действий ChildAction.

public class Action
{
    public Action Parent {get;set;}
    public ObservableCollection<Action> ChildActions {get;set;}
}

Класс ProjectVM представляет собой коллекцию действий Action:

public class ProjectVM : BaseVM
{
    public ObservableCollection<Action> Actions {get;set;}
}

В MainVM есть свойство, которое хранит активный проект:

public class MainVM : BaseVM
{
    public ProjectVM SelectedProject{get;set;}
}

В интерфейсной части ProjectVM представлен TreeView, а коллекция Actions его элементами, которые можно перетаскивать и вкладывать друг в друга.

Drag&Drop реализован с помощью GongSolutions.Wpf.DragDrop.

Мне нужно знать какой элемент куда был перенесен для формирования истории изменений (Undo/Redo) в каждом ProjectVM.

Но как в обработчиках Drag&Drop подцепиться к SelectedProject в рамках MVVM, которые находятся вне всей этой экосистемы и просто цепляются к контролам с помощью attached property?

<TreeView dd:DragDrop.UseDefaultDragAdorner="True"
          dd:DragDrop.IsDragSource="True"
          dd:DragDrop.IsDropTarget="True"
          dd:DragDrop.DropHandler="{Binding ElementName=UserControl, Path=DropHandler}"
          ItemsSource="{Binding Actions}" />

public class DropHandler : IDropTarget
{
    //...
    public void Drop(IDropInfo dropInfo)
    {
        //Здесь нужно взаимодействие с SelectedProject
    }
}

Можно, конечно, сделать свойство SelectedProject статическим, но что-то мне подсказывает, что это неправильно.

Может быть это вообще неправильный подход?

Answer 1

Воспользуйтесь мессенджером для передачи сообщений (читай - инициирование событий) между Вашими VM. В коде обработчика drop - вызываете событие, в нужной Вам модели это событие обрабатываете и сохраняете историю действий. Для этой цели можете воспользоваться event broker. Очень удобное API, позволит Вам обеспечить низкий уровень связности между классами приложения.

READ ALSO
C# xml в цикле for

C# xml в цикле for

Помогите разобраться с циклом и xmlЭто мой первый вопрос, я школьник, пытаюсь написать программу по созданию теста для одноклассников

213
Форматирование кода в VS Code (C#)

Форматирование кода в VS Code (C#)

Как настроить форматирование кода в VS Code под C# привык к нормальному компактному синтаксису в стиле Java, те

458
Как считывать по нескольку байтов из файла?

Как считывать по нескольку байтов из файла?

У меня есть файл для чтения(может быть любой)Мне нужно считывать из него определенное количество байт(к примеру 2)

209