博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

关于WF4SDK中的ExpressionTextBox例子的两个问题

Posted on 2009-12-05 18:47  生鱼片  阅读(1397)  评论(0编辑  收藏  举报

ExpressionTextBox是WF4中新提供的表达式编辑器,关于它的介绍可以看这篇文章 http://www.cnblogs.com/carysun/archive/2009/11/13/wf4-ExpressionTextBox.html,在SDK也有相关的Demo,但是SDK中的 ExpressionTextBox 例子,有两个问题

1.该例子中的MultiAssign活动如果你直接在工作流中使用,会报运行时错误。原代码如下:

namespace Microsoft.Samples.ExpressionTextBoxSample

{

    // Sets To1 = Value1 and To2 = Value2

    [Designer(typeof(MultiAssignDesigner))]

    public sealed class MultiAssign : CodeActivity

    {

        public OutArgument To1 { get; set; }

        public OutArgument To2 { get; set; }

        public InArgument Value1 { get; set; }

        public InArgument Value2 { get; set; }

 

        protected override void Execute(CodeActivityContext context)

        {

            // Obtain the runtime value of the arguments

            this.To1.Set(context, this.Value1.Get(context));

            this.To2.Set(context, this.Value2.Get(context));

        }

    }

}

 

由于我们使用的参数OutArgumentInArgument都是非强类型的,运行时并不会自动添加非强类型的参数,所以我们需要手动做这个工作。我们在重写CacheMetadata中来完成,代码如下:

   protected override void CacheMetadata(CodeActivityMetadata metadata)

        {

            AddArgument(metadata, this.To1, "To1", ArgumentDirection.Out);

            AddArgument(metadata, this.To2, "To2", ArgumentDirection.Out);

            AddArgument(metadata, this.Value1, "Value1", ArgumentDirection.In);

            AddArgument(metadata, this.Value2, "Value2", ArgumentDirection.In);

        }

 

        void AddArgument(CodeActivityMetadata metadata, Argument argument, string argumentName, ArgumentDirection direction)

        {

            Type argumentType = typeof(object);

 

            if (argument != null)

            {

                argumentType = argument.ArgumentType;

            }

 

            RuntimeArgument runtimeArgument = new RuntimeArgument(argumentName, argumentType, direction);

            metadata.Bind(argument, runtimeArgument);

            metadata.AddArgument(runtimeArgument);

        }

2.当然如果你使用强类型的话就不会有这个问题,比如将参数调整为如下:

public OutArgument<string> To1 { get; set; }

        public OutArgument<string> To2 { get; set; }

        public InArgument<string> Value1 { get; set; }

        public InArgument<string> Value2 { get; set; }

 

还有一个就是如果没有指定ExpressionTextBoxExpressionType属性,这会导致当你在设计器中如果你表达式值的类型不符合的时候,就会出现下图中比较奇怪的红框。

clip_image002

你可以设置该属性,引入命名空间并设置如下:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

ExpressionType="{x:Type TypeName=sys:String}"

这样设计就可以正常检查你输入的类型了。

 

周末休闲:

迪拜是阿联酋第二大酋长国,拥有世界上第一家七星级酒店、全球最大的购物中心、世界最大的室内滑雪场,来看看这些堪称奇迹的建筑吧!!  阅读全文http://www.cnblogs.com/carysun/archive/2009/12/05/dibai.html

参考资源:

1.http://blogs.msdn.com/cathyk/archive/2009/12/03/using-untyped-arguments-in-an-expressiontextbox.aspx
2.http://msdn.microsoft.com/en-us/library/ee663224(VS.100).aspx
3.http://www.cnblogs.com/carysun/archive/2009/11/13/wf4-ExpressionTextBox.html
4.http://msdn.microsoft.com/en-us/library/ee663224(VS.100).aspx
5.http://msdn.microsoft.com/en-us/library/system.activities.presentation.view.expressiontextbox.expressiontype(VS.100).aspx