[]
如果属性的类型是字符串,默认属性值是可以接受任意字符串的,如果希望提供字符串值候选列表,可以通过标注ComboPropertyAttribute 的并设置ValueList属性的方式实现。多个值用“|”分隔。
注意,标注ComboPropertyAttribute的属性类型必须是 string。
public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
{
[ComboProperty(ValueList = "Student|Teacher|Worker")]
public string MyProperty { get; set; }
public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
{
return new ExecuteResult();
}
public override CommandScope GetCommandScope()
{
return CommandScope.ExecutableInServer;
}
}
在设计器中效果如下:
如果需要更细致的控制,可以通过ComboPropertyAttribute的其他属性来控制。
1. 值与显示值不同
设置ComboPropertyAttribute 的 DisplayList 属性。
代码:
public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
{
[ComboProperty(ValueList = "Student|Teacher|Worker", DisplayList = "学生|教师|工人")]
public string MyProperty { get; set; }
public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
{
return new ExecuteResult();
}
public override CommandScope GetCommandScope()
{
return CommandScope.ExecutableInServer;
}
}
效果:
其他说明:
此方法可以使用户在选择时选择中文选项,而单元格实际保存值为英文,方便程序处理。ValueList和DisplayList通过数量和顺序匹配。如果DisplayList数量超出ValueList数量,多出部分会被忽略;如果DisplayList数量少于ValueList数量,不足部分会使用ValueList对应的值。
2. 允许用户使用列表以外的值
设置ComboPropertyAttribute 的 IsSelectOnly属性。
代码:
public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
{
[ComboProperty(ValueList = "Student|Teacher|Worker", IsSelectOnly = false)]
public string MyProperty { get; set; }
public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
{
return new ExecuteResult();
}
public override CommandScope GetCommandScope()
{
return CommandScope.ExecutableInServer;
}
}
效果:
注意:
IsSelectOnly 为 False 时,DisplayList 设置会被忽略;不填时 IsSelectOnly 属性的默认值为 True。
3. 支持搜索
设置ComboPropertyAttribute 的 Searchable 属性。
代码:
public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
{
[ComboProperty(ValueList = "aa|bb|cc", Searchable = true)]
public string MyProperty { get; set; }
[ComboProperty(ValueList = "aa|bb|cc", Searchable = true, IsSelectOnly = false)]
public string MyProperty2 { get; set; }
public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
{
return new ExecuteResult();
}
public override CommandScope GetCommandScope()
{
return CommandScope.ExecutableInServer;
}
}
效果:
策略:
如果 IsSelectOnly 为 True ,则搜索框会在下拉框中。
如果 IsSelectOnly 为 False ,则可以直接输入,下拉框会自动按照输入的字符匹配。此模式下同样可以输入下拉框中不存在的字符串。
本特性要求活字格版本大于等于9.0.100.0。
有时,下拉列表中的选项不是开发时决定的,而是动态生成,例如下拉打印机列表。可以通过重写Command的Designer 通过代码动态生成列表。
[Designer("MyPlugin.Designer.MyPluginServerCommandDesigner, MyPlugin")]
public class MyPluginServerCommand : Command, ICommandExecutableInServerSideAsync
{
public string MyProperty { get; set; }
public async Task<ExecuteResult> ExecuteAsync(IServerCommandExecuteContext dataContext)
{
return new ExecuteResult();
}
public override CommandScope GetCommandScope()
{
return CommandScope.ExecutableInServer;
}
}
public class MyPluginServerCommandDesigner : CommandDesigner<MyPluginServerCommand>
{
public override EditorSetting GetEditorSetting(PropertyDescriptor property, IBuilderCommandContext builderContext)
{
if (property.Name == nameof(MyPluginServerCommand.MyProperty))
{
var list = new string[] { "aaa", "bbb", "ccc" }; // 代码动态生成
return new ComboEditorSetting(list);
}
return base.GetEditorSetting(property, builderContext);
}
}
如果希望下拉列表的显示值和选择后保存的值不一样,可以如下修改 GetEditorSetting 方法,让List的每一项不是字符串,而是一个对象。通过设置 ComboEditorSetting 的 displayMember和valueMember来指定对象的哪个属性用于显示,哪个属性用于保存值。
public class MyPluginServerCommandDesigner : CommandDesigner<MyPluginServerCommand>
{
public override EditorSetting GetEditorSetting(PropertyDescriptor property, IBuilderCommandContext builderContext)
{
if (property.Name == nameof(MyPluginCellType.MyProperty))
{
var list = new List<ComboItem>
{
new ComboItem(null, "<空>"),
new ComboItem("student", "学生"),
new ComboItem("teacher", "教师")
};
return new ComboEditorSetting(list, nameof(ComboItem.Display), nameof(ComboItem.Value));
}
return base.GetEditorSetting(property, builderContext);
}
}
public class ComboItem
{
public ComboItem(string value, string display)
{
Value = value;
Display = display;
}
public string Value { get; set; }
public string Display { get; set; }
}