Как получить доступ к Аргументу активности в ActivityDesigner? - PullRequest
0 голосов
/ 30 мая 2019

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

MyActivity:

[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?
    }
}

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

enter image description here

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?

1 Ответ

1 голос
/ 31 мая 2019

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

Поскольку внутри конструктора я не могу получить 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 больше не равно нулю и несет необходимое значение. Надеюсь, это поможет кому-то или кому-то опубликовать лучшее решение.

Ура!

...