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

Замена контрола добавления новой метки в карточке

Замена контрола добавления новой метки в карточке

Предположим, что нам требуется заменить в карточке определенного типа стандартную кнопку "+" для добавления тегов на собственную кнопку с надписью "Добавить метку".

Для этой цели мы создаем новую модель представления, реализующую интерфейс IAddTagControlViewModel:

using Tessa.UI.Cards; using Tessa.UI.Tags.ViewModels; using Tessa.UI; using System.Windows.Input;

namespace Tessa.Extensions.Client { /// <summary> /// Вью-модель для кнопки добавления тега к карточке. /// </summary> public sealed class CustomAddTagButtonViewModel : ViewModel<EmptyModel>, IAddTagControlViewModel { #region Contstructors

public CustomAddTagButtonViewModel(ICardToolbarViewModel toolbar) { this.toolbar = toolbar; }

#endregion

#region Private Fields

private ICardToolbarViewModel toolbar;

#endregion

#region Public Fields

/// <summary> /// Команда добавления тега. /// </summary> public ICommand AddTagCommand { get; set; }

/// <summary> /// Тулбар карточки, на котором находится контрол добавления тега. /// </summary> public ICardToolbarViewModel Toolbar => this.toolbar;

#endregion } }

Затем - новый контрол с кнопкой в файле CustomAddTagButton.xaml:

<UserControl x:Class="Tessa.Extensions.Client.CustomAddTagButton" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="450" d:DesignWidth="800" mc:Ignorable="d"> <Button Command="{Binding AddTagCommand, Mode=OneTime}" Foreground="Black"> Добавить метку </Button> </UserControl>

В словарь ресурсов добавляем привязку модели представления к созданному компоненту:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Tessa.Extensions.Client">

<!-- Здесь располагаются DataTemplate для связи ViewModel и View --> <DataTemplate DataType="{x:Type local:CustomAddTagButtonViewModel}"> <local:CustomAddTagButton /> </DataTemplate>

</ResourceDictionary>

Наконец, создаем новое расширение:

using System; using System.Linq; using System.Threading.Tasks; using Tessa.Localization; using Tessa.Platform.Runtime; using Tessa.Tags; using Tessa.UI; using Tessa.UI.Cards; using Tessa.UI.Tags; using Tessa.UI.Tags.ViewModels;

namespace Tessa.Extensions.Client { public sealed class AddTagCustomButtonDemoExtension : CardUIExtension { #region Constructors

public AddTagCustomButtonDemoExtension( IUIHost uiHost, IAdvancedCardDialogManager cardDialogManager, CreateDialogFormFuncAsync createDialogFormFuncAsync, ITagManager tagManager, ITagInfoModelFactory tagInfoModelFactory, ISession session) { this.uiHost = uiHost; this.cardDialogManager = cardDialogManager; this.createDialogFormFuncAsync = createDialogFormFuncAsync; this.tagManager = tagManager; this.tagInfoModelFactory = tagInfoModelFactory; this.session = session; }

#endregion

#region Fields

private readonly IUIHost uiHost; private readonly IAdvancedCardDialogManager cardDialogManager; private readonly CreateDialogFormFuncAsync createDialogFormFuncAsync; private readonly ITagManager tagManager; private readonly ITagInfoModelFactory tagInfoModelFactory; private readonly ISession session;

#endregion

#region Base Overrides

public override async Task Initialized(ICardUIExtensionContext context) { var cardEditor = context.UIContext.CardEditor; cardEditor.Toolbar.CanHaveTags = true; context.UIContext.CardEditor.Toolbar.RightTagControl = new CustomAddTagButtonViewModel(context.UIContext.CardEditor.Toolbar) { AddTagCommand = new DelegateCommand( async x => { // Если в карточке были изменения, необходимо сохранить ее перед добавлением тега.

if (await cardEditor.CardModel.HasChangesAsync()) { if (await TessaDialog.ConfirmAsync(await LocalizationManager.GetStringAsync("Tags_SaveCardToAddTag"))) { var saveResult = await cardEditor.CardModel.SaveAsync(); if (!saveResult.Success) { return; } } else { return; } }

var tagInfo = await TagUIExtensions.SelectOrCreateTagAsync( this.createDialogFormFuncAsync, this.uiHost, this.cardDialogManager, context.Card.ID);

if (!(tagInfo is not null && !context.UIContext.CardEditor.Toolbar.TagsModel.Tags.Any(x => x.Id == tagInfo.ID))) { return; }

var tag = new Tag() { SetAt = DateTime.UtcNow, CardID = context.Card.ID, TagID = tagInfo.ID, UserID = this.session.User.ID }; await this.tagManager.AddTagAsync(tag, null, context.ValidationResult); if (context.ValidationResult.IsSuccessful()) { var tagInfoModel = this.tagInfoModelFactory.CreateModel(tagInfo, cardEditor.CardModel.Card); var viewTagInfoModel = new CardTagViewModel(tagInfoModel); cardEditor.Toolbar.TagsModel.Tags.Add(viewTagInfoModel); } }) }; }

#endregion } }

Теперь, после регистрации нашего расширения для выбранного типа карточек мы увидим в правой части тулбара вместо стандартного “плюса” кастомную кнопку с надписью “Добавить метку”.

Back to top