[]
        
(Showing Draft Content)

公式属性

如果属性值需要依赖公式的计算结果动态变化,可以通过标注FormulaPropertyAttribute 的方式设置。

注意,标注FormulaPropertyAttribute的属性类型必须是 object。

为支持公式属性,ExecuteAsync执行函数中也需要相应的处理,可以通过EvaluateFormulaAsync方法计算公式的值。

    public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
    {
        [FormulaProperty]
        public object MyProperty { get; set; }

        public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
        {
            var propCalcedValue = await dataContext.EvaluateFormulaAsync(this.MyProperty);
            return new ExecuteResult() { Message = propCalcedValue?.ToString() };
        }
        public override CommandScope GetCommandScope()
        {
            return CommandScope.ExecutableInServer;
        }
    }

在设计器中效果如下:



如果需要更细致的控制,可以通过FormulaPropertyAttribute的其他属性来控制。

1.提供备选列表。

  1. 设置FormulaPropertyAttribute 的 RecommendedValues 属性,使用“|”分隔多个候选项。

  2. 代码:

        [Designer("MyPlugin.Designer.MyPluginServerCommandDesigner, MyPlugin")]
        public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
        {
            [FormulaProperty(RecommendedValues = "学生|教师|工人")]
            public object MyProperty { get; set; }
    
            public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
            {
                var propCalcedValue = await dataContext.EvaluateFormulaAsync(this.MyProperty);
                return new ExecuteResult() { Message = propCalcedValue?.ToString() };
            }
            public override CommandScope GetCommandScope()
            {
                return CommandScope.ExecutableInServer;
            }
        }
  3. 效果:


2.支持输入多行文本。

  1. 设置FormulaPropertyAttribute 的 AcceptsReturn 属性。

  2. 代码:

        public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
        {
            [FormulaProperty(AcceptsReturn = true)]
            public object MyProperty { get; set; }
    
            public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
            {
                var propCalcedValue = await dataContext.EvaluateFormulaAsync(this.MyProperty);
                return new ExecuteResult() { Message = propCalcedValue?.ToString() };
            }
            public override CommandScope GetCommandScope()
            {
                return CommandScope.ExecutableInServer;
            }
        }
  3. 效果:


3.支持多语言。

  1. 所有公式属性,默认会开启多语言支持,可以通过设置FormulaPropertyAttribute 的 CanSelectResource 属性关闭多语言支持。

  2. 代码:

        public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
        {
            [FormulaProperty(CanSelectResource = false)]
            public object MyProperty { get; set; }
    
            public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
            {
                var propCalcedValue = await dataContext.EvaluateFormulaAsync(this.MyProperty);
                return new ExecuteResult() { Message = propCalcedValue?.ToString() };
            }
            public override CommandScope GetCommandScope()
            {
                return CommandScope.ExecutableInServer;
            }
        }
  3. 此特性为 10.0.0.0 新增的特性。