Добавляем поля карточки внутрь кастомного диалога WPF
Добавляем поля карточки внутрь кастомного диалога WPF¶
Пусть есть диалоговое окно WPF с каким-то кастомным контентом, в которое в определённом месте надо добавить UI карточки с автокомплитом, биндингами и прочими прелестями. Например, в диалоге импорта карточек из журнала Excel нужно одновременно выбрать файл, из которого импортируются карточки, и категорию, контрагента или еще какие-то поля, которые попадут в созданные карточки.
-
Создаём скрытый тип карточки с виртуальными секциями под UI, по аналогии с типом System/Dialogs. В него мы добавляем вкладку с некоторым названием MyTabName (на основной вкладке не надо ничего добавлять). На вкладку помещаем все контролы.
-
В конструкторе вью модели диалога из Unity берём значения и записываем в поля класса:
IUnityContainer unityContainer ICardMetadata cardMetadata ICardRepository cardRepository ICardDialogManager dialogManager CreateCardModelFunc createCardModelFunc
-
Пишем код в месте, в котором надо нарисовать диалог
CardNewRequest request = new CardNewRequest { CardTypeID = MyCardType.MyDialogsTypeID }; CardNewResponse response = this.cardRepository.New(request); if (!response.ValidationResult.IsSuccessful()) { TessaDialog.ShowNotEmpty(response.ValidationResult.Build()); return; }
Card card = response.Card; card.ID = Guid.NewGuid();
ICardModel model = this.createCardModelFunc(card, response.SectionRows, x => this.dialogManager.ShowRow(x));
CardType myDialogType = this.cardMetadata.CardTypes[MyCardType.MyDialogsTypeID]; CardTypeNamedForm form = myDialogType.Forms.First(x => x.Name == "MyTabName");
IFormViewModel formModel = FormTypeRegistry.Instance.Get(form).CreateForm(form, null, model, this.unityContainer);
-
Теперь formModel можно положить в property вью модели, на которое забинден ContentPresenter в UI твоего диалога. Объект card просто кладём в поле класса.
-
В момент, когда пользователь нажимает в диалоге кнопку “Ок, выполнить”, вью модель диалога может получить card из поля, и определить, какие значения были записаны в определённые виртуальные секции псевдокарточки.
Если не хочется, чтобы ради виртуальных секций диалога выполнялся бы запрос к серверу, можно создавать карточку вручную:
// добавляем в класс вью модели поле:
private static readonly ICardNewComponent newComponent =
new CardNewComponent(
new CardNewStrategy(
CardCachingStrategyFactory.CreateNewStrategy(CardCachingStrategyType.Local)));
// и дополнительно получаем из Unity:
// ISession session
// в точке вызова, вместо обращения к cardRepository:
CardNewResponse response = newComponent.New(request, this.cardMetadata, this.session);
// и дальше всё как обычно
При таком подходе никаких расширений не будет, но и запроса к серверу не будет.