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

Добавление дополнительных функции для пользовательского обьекта

В прошлой статье был создан обьект с собственным представлением. Добавим для него возможность отображения на панели управления и работы с ним с помощью блока.

Добавление возможности отображения на панели управления

Model

Для Model необходимо добавить параметр IsDashboardSupported = true в имеющийся атрибут:

...
 [CustomType("[GUID]", Category = "TEST", IsDashboardSupported = true)]
    public class TestResult : IECustomTypeBase
...

ViewModel

Для ViewModel необходимо реализовать интерфейс IDashboardSupport:

...
[CustomTypeViewModel("[GUID]", typeof(TestResult))]
   public partial class TestResultViewModel : ObservableObject, IDashboardSupport
...
public object? Entity => _testResult;
...

View

Для View необходимо добавить еще один атрибут DashboardCustomTypeView:

...
[CustomTypeView("[GUID]", typeof(TestResultViewModel))]
[DashboardCustomTypeView("[GUID]",
    typeof(TestResultViewModel),
    400, 300,
    toolItemIconResourceKey:"TestResult_Icon")]
public partial class TestResultView : UserControl
...

В атрибуте указывается размер элемента, а также название иконки в формате svg.
Пример содержания такого файла:

M10.25 10a1.25 1.25 0 1 0-2.499 0a1.25 1.25 0 0 0 2.499 0m6 0a1.25 1.25 0 1 0-2.499 0a1.25 1.25 0 0 0 2.499 0m-6.114 5.106a.75.75 0 0 0-.772 1.286c.767.46 1.72.67 2.636.67s1.87-.21 2.636-.67a.75.75 0 1 0-.772-1.286c-.483.29-1.154.456-1.864.456s-1.38-.166-1.864-.456M22.002 12c0-5.524-4.478-10.002-10.002-10.002S2 6.476 2 12c-.001 5.523 4.476 10 10 10s10.002-4.477 10.002-10M3.499 12a8.502 8.502 0 1 1 17.003 0a8.502 8.502 0 0 1-17.003 0

Для отображение иконки, она должна быть помещена в директорию проекта Assets с расширением .geometry.
Файл .geametry в проекте должен иметь параметр BuildAction = AvaloniaResource.

Добавление блока для взаимодействия с обьектом

Для примера добавим блок установки количества пройденных испытание и бракованных изделий.

Создание Action

Создадим класс TestResultActions. Опишем его подобно блоку CustomDivision из первой статьи:

[ActionsContainer(
    "[GUID]",
    Name = "TestAction",
    Category = "Test",
    Lifetime = InstanceLifetime.Singleton)]
public class TestResultActions
{
    [Action("[GUID]", Name = "SetTestResult")]
    public void SetTestResult(
    [InputArgument("[GUID]")]
    TestResult testResult,
    [InputArgument("[GUID]")]
    double passed,
    [InputArgument("[GUID]")]
    double failed)
    {
        testResult.Passed = passed;
        testResult.Failed = failed;
    }
}

Зарегистрируейм его в классе EPlugin:

public override void Register(IEmikaRegistry registry)
{
    registry.AddActions(typeof(TestResultActions));
    registry.AddDataType<TestResult>(typeof(TestResultViewModel), [typeof(TestResultView)]);
...
    registry.RemoveActions(typeof(TestResultActions));
    registry.RemoveDataType(typeof(TestResult));
}

Model

Добавим события о том, что изменилось количество пройденных и бракованных изделий, чтобы соответственно обновить модель представления:

[JsonIgnore]
public EventHandler? PassedChanged;
[JsonIgnore]
public EventHandler? FailedChanged;

private double _passed = 100.0;

public double Passed
{
    get
    {
        return _passed;
    }
    set
    {
        _passed = value;
        PassedChanged?.Invoke(this, EventArgs.Empty);
    }
}

private double _failed = 45.0;

public double Failed
{
    get
    {
        return _failed;
    }
    set
    {
        _failed = value;
        FailedChanged?.Invoke(this, EventArgs.Empty);
    }
}

ViewModel

Подпишемся на события:

public TestResultViewModel(TestResult testResult)
{
    _testResult = testResult;
    _testResult.PassedChanged += OnModelPassedChanged;
    _testResult.FailedChanged += OnModelFailedChanged;

    Passed = _testResult.Passed;
    Failed = _testResult.Failed;
}

private void OnModelPassedChanged(object? sender, EventArgs e)
{
    Passed = _testResult.Passed;
}

private void OnModelFailedChanged(object? sender, EventArgs e)
{
    Failed = _testResult.Failed;
}

partial void OnPassedChanged(double value)
{
    _testResult.Passed = value;
}

partial void OnFailedChanged(double value)
{
    _testResult.Failed = value;
}

Готово. Теперь с обьектом можно взаимодействовать через блок и выносить его на панель уравления.

Загрузить готовый проект из статьи