Здравствуйте, у меня возникла проблема с настраиваемой активностью, которая выполняет предварительную оценку `ActivityFunc` и возвращает false, даже если она оценивается в Execute как истинная. Вот мои действия
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using System.ComponentModel;
using System.Activities.Presentation;
namespace SomeActivities
{
///
/// Root of any number of activities used to check for a specific set of conditions to be true (Trigger Conditions)
///
public sealed class Trigger : NativeActivity, IActivityTemplateFactory
{
///
/// The initial Condition that determines if the trigger should be scheduled
///
/// The condition.
[RequiredArgument]
public ActivityFunc <bool> Condition { get; set; }
///
/// The resulting action that is scheduled if the Condition is true
///
/// The child.
[RequiredArgument]
public ActivityAction Child { get; set; }
///
/// Gets or sets the value holding whether or not the trigger matches the condition
///
/// The type of the match.
public MatchType MatchType{ get; set; }
private CompletionCallback<bool> OnExecutionCompleteCallBack;
protected override void Execute(NativeActivityContext context)
{
this.OnExecutionCompleteCallBack = this.OnConditionComplete;
context.ScheduleFunc<bool>(this.Condition, this.OnExecutionCompleteCallBack);
}
public void OnConditionComplete(NativeActivityContext context, ActivityInstance instance, bool result)
{
if (instance.State == ActivityInstanceState.Canceled)
{
context.Abort();
return;
}
//check if Condition evaluation returns true
//Always show as false
if (result)
{
//If so then schedule child Activity
context.ScheduleAction(Child);
}
}
Activity IActivityTemplateFactory.Create(System.Windows.DependencyObject target)
{
return new Trigger()
{
Child = new ActivityAction()
{
DisplayName = "Trigger Child Action"
},
Condition = new ActivityFunc<bool>()
{
DisplayName = "Trigger Conditionals",
Result = new DelegateOutArgument<bool>()
},
DisplayName = "Trigger",
MatchType = MatchType.Matches,
};
}
}
}
Поэтому, когда мое условие оценивается в методе выполнения, он вызывает OnConditionComplete с результатом (что всегда ложно), даже если я печатаю результат условия как истинный. Значит, здесь что-то явно не так, чего я не вижу?
Обновить
Хорошо, я думаю, что Марис говорила о том, что обратный вызов в классе и просто метод OnConditionComplete указывает на обратный вызов. Я менял, но изменений не увидел. Если бы я мог каким-то образом получить значение из условия ActivityFunc<bool> child
при его фактическом выполнении или сохранить его значение после этого, это сработало бы отлично. Я поигрался с метаданными CacheMetadata, чтобы посмотреть, есть ли что-нибудь, что я мог бы найти, что позволило бы мне это сделать, но пока ничего не нашел.
Обновление 2
Проблема, по-видимому, исходит от ActivityFunc <bool> Condition
. Мне нужно пройти и проверить, в чем могут быть проблемы с условием. Не уверен, следует ли это перейти к новому вопросу или нет, поскольку он технически не решен, но я посмотрю, как составить тестовое условие, чтобы выйти из него, и, если ничего другого, показать, где я нахожусь.
Хорошо, это простой пример того, что я использую в качестве дочерней активности, которая всегда возвращает false, даже если при выполнении она оценивается как true.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using System.Activities.Presentation;
using System.ComponentModel;
using System.Drawing;
namespace SomeActivities
{
public sealed class DataHandlerTypeName : NativeActivity,IActivityTemplateFactory
{
// Define an activity input argument of type string
[RequiredArgument]
public InArgument ImportContext { get; set; }
///
/// Gets or sets the handler type name to check.
///
/// The handler type name to check.
[RequiredArgument]
public string HandlerTypeNameToCheck { get; set; }
///
/// Performs the trigger check for the matching Data Type Handler Names
///
/// The context.
protected override void Execute(NativeActivityContext context)
{
var ic = this.ImportContext.Get(context);
if (1==1)
{
//context.SetValue(base.Result, true);
Result.Set(context, true);
}
else
{
//context.SetValue(base.Result, true);
Result.Set(context, false);
}
}
#region IActivityTemplateFactory Members
Activity IActivityTemplateFactory.Create(System.Windows.DependencyObject target)
{
return new DataHandlerTypeName()
{
ImportContext = this.ImportContext,
HandlerTypeNameToCheck = "Default"
};
}
#endregion
}
}