Как получить доступ к аргументу активности в ActivityDesigner?

Мне нужно получить значение InArgument моей пользовательской активности в ActivityDesigner.

Моя активность:

[Designer(typeof(ReadTextDesigner))]
public sealed class ReadText : CodeActivity
{
    public InArgument<string> ImageName { get; set; }

    protected override void Execute(CodeActivityContext context)
    {
    }
}

Мой дизайнер:

public partial class ReadTextDesigner
{
    public ReadTextDesigner()
    {
        InitializeComponent();
        //this.ModelItem is null here.. WHY is it null?
        //How do I get Activity's ImageName here?
    }
}

У меня также есть кнопка, как на изображении ниже, и когда вы нажимаете на нее, я МОЖНО УСТАНОВИТЬ мое пользовательское значение Activity выглядит следующим образом:

Как получить доступ к аргументу активности в ActivityDesigner?

private void BtnStart_OnClick(object sender, RoutedEventArgs e)
    {
        this.ModelItem?.Properties["ImageName"]?.SetValue(new InArgument<string>()
        {
            Expression = "some value"
        });
    }

XAML:

<sapv:ExpressionTextBox 
    Expression = "{Binding Path=ModelItem.ImageName, Mode=TwoWay, Converter = {StaticResource ArgumentToExpressionConverter}, ConverterParameter=In }"
    ExpressionType = "s:String"
    HintText = "Enter a string"
    OwnerActivity = "{Binding Path=ModelItem}"
    Width = "110"
    Margin = "0,5"
    Grid.Row = "0"
    MaxLines = "1"
    x:Name = "TxtImagePath"/>

<Button Grid.Column = "0" Grid.Row = "1" Content = "Get Image" HorizontalAlignment = "Center" Click = "BtnStart_OnClick" x:Name = "BtnStart"/>

Как получить конструктор Activity InArgument ReadTextDesigner?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это довольно странно, но я нашел обходной путь. Хотя это решение А, я надеюсь на гораздо лучшее;

Поскольку в конструкторе я не могу получить ModelItem, я создал новый Thread отдельно от основного потока. Этот новый поток ждет 2 миллисекунды, а затем пытается получить ModelItem, и каким-то образом ему это удается.

Вот новый модифицированный ReadTextDesigner код (Примечание: я изменил только код ReadTextDesigner и больше ничего)

public ReadTextDesigner()
{
    InitializeComponent();

    new TaskFactory().StartNew(() => { this.Dispatcher.Invoke(() => SetImage(this)); });
}

private void SetImage(ReadTextDesigner designer)
{
    Thread.Sleep(2);
    if (designer.ModelItem.GetCurrentValue() is ReadText readText)
    {
        var imageName = readText.ImageName?.Expression?.Convert<string>();
        if (!string.IsNullOrWhiteSpace(imageName))
        {
            //imageName has a value at this point!
        }
    }
}

ModelItem больше не является нулевым и несет необходимое значение. Надеюсь, это поможет кому-то или кому-то опубликовать лучшее решение.

Ваше здоровье!

Другие вопросы по теме