Перейти к содержанию

Добавляем поля карточки внутрь кастомного диалога WPF

Добавляем поля карточки внутрь кастомного диалога WPF

Пусть есть диалоговое окно WPF с каким-то кастомным контентом, в которое в определённом месте надо добавить UI карточки с автокомплитом, биндингами и прочими прелестями. Например, в диалоге импорта карточек из журнала Excel нужно одновременно выбрать файл, из которого импортируются карточки, и категорию, контрагента или еще какие-то поля, которые попадут в созданные карточки.

  1. Создаём скрытый тип карточки с виртуальными секциями под UI, по аналогии с типом System/Dialogs. В него мы добавляем вкладку с некоторым названием MyTabName (на основной вкладке не надо ничего добавлять). На вкладку помещаем все контролы.

  2. В конструкторе вью модели диалога из Unity берём значения и записываем в поля класса:

    IUnityContainer unityContainer ICardMetadata cardMetadata ICardRepository cardRepository ICardDialogManager dialogManager CreateCardModelFunc createCardModelFunc

  3. Пишем код в месте, в котором надо нарисовать диалог

    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);

  4. Теперь formModel можно положить в property вью модели, на которое забинден ContentPresenter в UI твоего диалога. Объект card просто кладём в поле класса.

  5. В момент, когда пользователь нажимает в диалоге кнопку “Ок, выполнить”, вью модель диалога может получить 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);

// и дальше всё как обычно

При таком подходе никаких расширений не будет, но и запроса к серверу не будет.

Back to top