使用 ModelItem 编辑上下文
ModelItem 编辑上下文是主机应用程序用来与设计器进行通信的对象。 EditingContext 公开两个可以使用的方法:Items 和 Services
项集合
Items 集合用于访问主机与设计器之间共享的数据或所有设计器都可以使用的数据。 通过 ContextItemManager 类访问时,此集合具有以下功能:
服务集合
Services 集合用于访问设计器用来与主机交互的服务或访问所有设计器都使用的服务。 此集合有以下需要注意的方法:
为活动指定设计器
为指定活动要使用的设计器,使用了 Designer 属性。
[Designer(typeof(MyClassDesigner))]
public sealed class MyClass : CodeActivity
{
}
创建服务
若要创建一个服务,充当设计器与主机之间的信息管道,必须创建一个接口和一个实现。 接口由 Publish 方法用来定义服务的成员,而实现则包含服务的逻辑。 在下面的代码示例中,创建了一个服务接口和一个实现。
public interface IMyService
{
IEnumerable<string> GetValues(string DisplayName);
}
public class MyServiceImpl : IMyService
{
public IEnumerable<string> GetValues(string DisplayName)
{
return new string[] {
DisplayName + " One",
DisplayName + " Two",
"Three " + DisplayName
} ;
}
}
发布服务
为使设计器能够使用服务,必须先由主机使用 Publish 方法将服务发布。
this.Context.Services.Publish<IMyService>(new MyServiceImpl);
订阅服务
设计器在 Subscribe 方法中使用 OnModelItemChanged 方法来获得对服务的访问。 下列代码段演示了订阅服务的方法。
protected override void OnModelItemChanged(object newItem)
{
if (!subscribed)
{
this.Context.Services.Subscribe<IMyService>(
servInstance =>
{
listBox1.ItemsSource = servInstance.GetValues(this.ModelItem.Properties["DisplayName"].ComputedValue.ToString());
}
);
subscribed = true;
}
}
使用项集合共享数据
使用项集合与使用服务集合类似,但使用的是 SetValue,而不是 Publish。 此集合更适合在设计器与主机之间的共享简单的数据,不适合复杂的功能。
EditingContext 主机项和服务
.NET Framework 提供了大量通过编辑上下文访问的内置项和服务。
项:
AssemblyContextControlItem:管理将在控件(如表达式编辑器)的工作流内部使用的引用和本地程序集的列表。
ReadOnlyState:指示设计器是否处于只读状态。
Selection:定义当前所选对象的集合。
WorkflowFileItem:提供有关当前编辑会话所基于的文件的信息。
服务:
AttachedPropertiesService:允许使用 AddProperty 将属性添加到当前实例中。
DesignerView:允许访问设计器画布的属性。
IActivityToolboxService:允许更新工具箱的内容。
ICommandService:用于将设计器命令(如上下文菜单)与自定义的服务实现集成。
IDesignerDebugView:为设计器调试器提供功能。
IExpressionEditorService:提供对“表达式编辑器”对话框的访问。
IIntegratedHelpService:为设计器提供集成的帮助功能。
IValidationErrorService:使用 ShowValidationErrors 提供对验证错误的访问。
IWorkflowDesignerStorageService:提供内部服务以存储和检索数据。 此服务由 .NET Framework 内部使用,不能在外部使用。
IXamlLoadErrorService:使用 ShowXamlLoadErrors 提供对 XAML 加载错误集合的访问。
ModelService:由设计器用来与正在编辑的工作流模型进行交互。
ModelTreeManager:使用 Root 提供对模型项树根的访问。
UndoEngine:提供撤消和重做功能。
ViewService:将可视元素映射到基础模型项。
ViewStateService:存储模型项的视图状态。
VirtualizedContainerService:用于自定义虚拟容器 UI 行为。
WindowHelperService:用于注册和注销事件通知的委托。 还允许设置一个窗口所有者。