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

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 { getset; }

        public OutArgument To2 { getset; }

        public InArgument Value1 { getset; }

        public InArgument Value2 { getset; }

 

        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 { getset; }

        public OutArgument<string> To2 { getset; }

        public InArgument<string> Value1 { getset; }

        public InArgument<string> Value2 { getset; }

 

还有一个就是如果没有指定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


本文转自生鱼片博客园博客,原文链接:http://www.cnblogs.com/carysun/archive/2009/12/05/ExpressionTextBox-issue.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值