/ / Прив'язка / передача даних між моделями перегляду за допомогою Caliburn.Micro з Ninject та WPF - wpf, mvvm, ninject, viewmodel, caliburn.micro

Прив'язка / передача даних між viewmodels з використанням Caliburn.Micro з Ninject і WPF - wpf, mvvm, ninject, viewmodel, caliburn.micro

У мене є програма, яка показує варіантидіалогове вікно. Всередині цього діалогового вікна параметрів я показую список єдинорогів. Коли я вибираю єдинорога, я можу редагувати або видаляти його. Коли я хочу відредагувати єдинорога, він показує інше діалогове вікно EditUnicorn над діалоговим вікном параметрів. Діалогове вікно EditUnicorn містить вкладки, кожна для редагування певних даних єдинорога.

Application
--> Options window showing unicorns (OptionsView)
----> edit unicorn dialog  (EditUnicornView)
------> tabpages with usercontrols inside the edit unicorn dialog to fill in specific data about unicorn. (tabpages: EditUnicornSkillsView, EditUnicornFriendsView, EditUnicornGeneralView, ...)

Модель єдинорога в моєму графічному інтерфейсі, яка насправді більше модель перегляду ...

public class Unicorn
{
public string Name { get; set; }
public int Age { get; set; }
public string Strength { get; set; }
public Health HealthStatus { get; set; }
public List<Unicorn> Friends { get; set; }
}


public class OptionsViewModel : PropertyChangedBase
{
public ObservableCollection<Unicorn> Unicorns { get return MyData.Unicorns; }

private Unicorn _SelectedUnicorn;
public Unicorn SelectedUnicorn {
get { return _SelectedUnicorn; }
set {
_SelectedUnicorn = value;
NotifyOfPropertyChange(() => CanAddUnicorn);
NotifyOfPropertyChange(() => CanEditUnicorn);
NotifyOfPropertyChange(() => CanDeleteUnicorn);
}
}

public void EditUnicorn() {
// Is this correct?
WindowManager.ShowDialog(IoC.Get<EditUnicornViewModel(), SelectedUnicorn, null);
}
}

public class EditUnicornViewModel : Screen
{
// should it be like this? (or via the constructor or ...?)
public Unicorn Unicorn { get; set; }
}

EditUnicornView.xaml містить:

<TabControl>
<TabItem Header="General">
<ContentControl x:Name="EditUnicornGeneralViewModel" />
</TabItem>
<TabItem Header="Skills">
<ContentControl x:Name="EditUnicornSkillsViewModel" />
</TabItem>
<TabItem Header="Friends">
<ContentControl x:Name="EditUnicornFriendsViewModel" />
</TabItem>
</TabControl>

Моделі перегляду для елементів керування користувача, які знаходяться на вкладках:

public class EditUnicornGeneralViewModel : PropertyChangedBase
{
public string Name { get; set; }
public int Age { get; set; }
}

public class EditUnicornSkillsViewModel : PropertyChangedBase
{
public string Strength { get; set; }
public Health HealthStatus { get; set; }
}

public class EditUnicornFriendsViewModel : PropertyChangedBase
{
public List<Unicorn> Friends { get; set; }
}

Я створив клас Unicorn Model у своєму графічному інтерфейсідодаток, який насправді більше модель перегляду, Я створив це, оскільки кожен елемент керування на вкладці має певні моделі перегляду, щоб відображати лише необхідні дані. Я не впевнений, чи правильно це зробив.

Тепер питання в тому, що, як ви бачите, EditUnicornViewModel (майже) порожній .. Як передати вибраний Єдиноріг EditUnicornViewModel. Як можна додати / ввести / прив’язати / встановити властивість однієї моделі перегляду до іншої властивості іншої моделі перегляду? (ninject + caliburn.micro) А потім знову виникає та сама проблема: як мені встановити конкретні поля Єдинорога в кожному EditUnicorn (Загальні / Навички / Друзі) ViewModel з EditUnicornViewModel?

Редагувати:

Я не думаю, що це правильний спосіб роботи (і тоді я все одно не мав би поняття, як це зробити за допомогою вкладки):

public class OptionsViewModel : PropertyChangedBase
{
// ...

public void EditUnicorn()
{
var vm = IoC.Get<EditUnicornViewModel>();
vm.Unicorn = SelectedUnicorn;
WindowManager.ShowDialog(vm, null, null);

}
}

Відповіді:

1 для відповіді № 1

Калібурн.Micro поставляється з надійним EventAggregator, який пропонує чистий спосіб передавати дані по системі, не припускаючи, що хтось слухає. Це був би ваш найкращий варіант, оскільки це означає, що N багато вкладок можуть слухати та надсилати повідомлення. Побачити http://caliburnmicro.codeplex.com/wikipage?title=The%20Event%20Aggregator&referringTitle=Documentation

EDIT:

Я просто хочу додати, добре прочитатиdocs, Caliburn.Micro базується на ідеї композиції, вам ніколи не доведеться викликати IOC. Отримати себе. В основному ваш додаток повинен складати стек так

 Shell > Conductor > Conducted ViewModels

Погляньте на зразки в репо, оскільки вони демонструють багато цікавих особливостей композиції.