Мне нужно получить значение 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 выглядит следующим образом:
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
?
Это довольно странно, но я нашел обходной путь. Хотя это решение А, я надеюсь на гораздо лучшее;
Поскольку в конструкторе я не могу получить 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
больше не является нулевым и несет необходимое значение.
Надеюсь, это поможет кому-то или кому-то опубликовать лучшее решение.
Ваше здоровье!