Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 活动无法设置在其范围内定义的变量?_.net_Variables_Workflow Foundation 4 - Fatal编程技术网

.net 活动无法设置在其范围内定义的变量?

.net 活动无法设置在其范围内定义的变量?,.net,variables,workflow-foundation-4,.net,Variables,Workflow Foundation 4,这个让我抓狂,我想知道我是否理解正确 我试图在活动中定义一个可由子活动使用的变量。父级应该能够在运行时在此变量中设置一个值 下面是精简的父类: public sealed class Parent : NativeActivity, IActivityTemplateFactory { public Collection<Child> Children { get; private set; } private CompletionCallback<string

这个让我抓狂,我想知道我是否理解正确

我试图在活动中定义一个可由子活动使用的变量。父级应该能够在运行时在此变量中设置一个值

下面是精简的父类:

public sealed class Parent : NativeActivity, IActivityTemplateFactory
{
    public Collection<Child> Children { get; private set; }
    private CompletionCallback<string> _cc;
    private Variable<int> _index;
    public Collection<Variable> Variables { get; private set; }        
    public Parent()
    {
        Children = new Collection<Child>();
        _index = new Variable<int>();
        _cc = new CompletionCallback<string>(OnComplete);
        Variables = new Collection<Variable>();
    }
    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        metadata.AddImplementationVariable(_index);
        metadata.SetVariablesCollection(Variables);
    }
    protected override void Execute(NativeActivityContext context)
    {
        _index.Set(context, 0);
        var input = Variables.First(x => x.Name == "ThisIsTheVariable");
        input.Set(context, "This is the Value");
        context.ScheduleActivity(Children[0], _cc);
    }
    private void OnComplete(NativeActivityContext context, ActivityInstance instance, string result)
    {
        var index = _index.Get(context) + 1;
        _index.Set(context, index);
        Console.WriteLine(result);
        if (index < Children.Count)
            context.ScheduleActivity(Children[index], _cc);
    }
    Activity IActivityTemplateFactory.Create(System.Windows.DependencyObject target)
    {
        var retval = new Parent();
        retval.Variables.Add(new Variable<string>("ThisIsTheVariable"));
        return retval;
    }
}
这不会抛出,但子活动永远不会看到
DERP
,因为它们所绑定的变量的实例显然与
\u text
不同,因为绑定的计算结果为
null

第二种方法是从Variables集合中获取变量并进行设置

protected override void Execute(NativeActivityContext context)
{
    Variables.First().Set(context, "DERP");
    context.ScheduleActivity(Children[0], _cc);
}
这将导致引发相同的异常。我无法触及在我自己的范围内定义的变量。

您需要使用包装来包装需要访问同一变量的子活动,并将其传递给该子活动。需要使用将变量本身添加到父活动中,而父活动本身可以像您所做的那样对其进行操作。像ForEach这样的活动也是这样做的


有关更多详细信息,请参阅我的博客。

旧问题,但由于我一直在寻找解决方案,可能其他人也在寻找

我找到了一种使用context.DataContext实现这一点的方法

在原始示例中,替换

var input = Variables.First(x => x.Name == "ThisIsTheVariable"); 
input.Set(context, "This is the Value");


ActivityAction对于一个孩子来说是很好的,但是当你有一群孩子的时候,你怎么做呢?我试图避免要求用户插入序列,因为他们很可能总是添加多个子项。约定是只有一个子项,并允许用户在需要时添加序列,就像ForEach等一样,但是没有任何东西可以阻止您自己在IActivityTemplate或相关设计器中这样做。@Maurice:我可以看到一个转换器在ActivityAction中包装一个活动,但是变量应该如何绑定到AA的参数?再说一次,我肯定可以用一个孩子来代替这个系列,但是因为我完全希望有不止一个孩子,所以看起来。。。莫里斯:我想我可以有一个孩子,让它成为一个序列,然后直接绑定到它的集合而不是我自己的集合,但这样做似乎有点奇怪。从设计器的角度来看是有效的,但从代码的角度来看是不正确的。您将变量的值作为参数传递给ScheduleAction,子级不使用原始变量。该参数显示给所有子元素,就像另一个变量或InArgument一样。因此,就数据而言,无论是单个子项还是序列,都不重要。我将尝试这个。我一直在通过使用ActivityAction和设置他们的论点来回避这个问题。如果这样行的话,该死的,WF4团队!很好地处理了错误消息!:(由
DataContext.GetProperties()[]
返回的实例不是变量集合中声明的同一个变量,它们在设计时不可用。因此这不是一个解决方案,而是一个黑客解决方案。
protected override void Execute(NativeActivityContext context)
{
    Variables.First().Set(context, "DERP");
    context.ScheduleActivity(Children[0], _cc);
}
var input = Variables.First(x => x.Name == "ThisIsTheVariable"); 
input.Set(context, "This is the Value");
var input = context.DataContext.GetProperties()["ThisIsTheVariable"];
input.SetValue(context.DataContext, "This is the Value");