Word 加载项中的绑定用法

Posted

技术标签:

【中文标题】Word 加载项中的绑定用法【英文标题】:Binding usage in Word Add-in 【发布时间】:2016-12-31 10:42:32 【问题描述】:

我想使用 Office 插件技术为 Word 文档提供模型-视图-控制器逻辑。

在我的场景中,用户应该能够创建一个新的 Word 文档、激活加载项并在加载项内按一个按钮以向文档添加一个文本框字段。该字段应显示来自数据库的数字:当用户更新该数字并按保存时,该数字应写回数据库。下次打开 Word 文档时,应刷新数字,以显示更新后的值。

我想知道的是插件技术是否可以使用(可能有绑定支持?)还是仍处于试验阶段。我在尝试理解构建仅代表我的文本框的紧凑 OOXML 的最佳方法时遇到了麻烦:getSelectedDataAsync 方法输出一个非常复杂的文档,它不能是描述单灯基本差的更聪明的方法-裸文本框字段!以及如何将绑定设置为自定义 XML?该 XML 应该放在哪里?文件里面?我查看了 Microsoft 在 GitHub 上提供的示例,但它们不是很清楚,因为在许多情况下它们基于现有的 Word 文档,这些文档已经具有必要的数据和字段。

【问题讨论】:

您好,Jeanie,我有几个关于您的案例的问题,希望能为您提供更好的指导。 A)您需要一个文本字段还是可以插入内容控件? B) 关于字段的更新,只要加载项处于活动状态,您就可以更新字段。我们不支持(截至 2016 年 8 月)任何用于保存或打开文档的事件,您可以通过在加载项上公开一个按钮来更新您的后端,或者如果控件的内容发生更改。请提供更多细节。谢谢!用于 Word.js 的 Juan Balmori PM 嗨 Juan,我错误地将其称为“文本框”:“内容控件”会很棒。所以你是说当点击预定义的保存按钮时没有一种干净的方式来获得通知?我必须在加载项上添加一个自定义保存,因为当内容更改时更新后端不是一个选项,它会经常发生。感谢您的回复! 实际上,现在我们在保存文档时没有事件。而且我不确定这是否是需要的,例如在在线客户端中,我们总是将文档保存在后台。是的,我现在建议您在加载项上添加保存选项。 【参考方案1】:

绝对!您描述的场景实际上是该平台最初设计的主要插件类型之一。关键元素是一个 javascript 对象,我们称之为“绑定”,它跟踪文档中的内容控件,不需要 OXML 或自定义 XML。

API 可以直接添加内容控件(类似于文本框):调用Bindings.addFromSelectionAsync 方法。

function addNewField(fieldName)
    Office.context.document.bindings.addFromSelectionAsync("text",
     id: fieldName ,
    function (asyncResult)
        displayNumberFromDatabase(asyncResult.value);
    

还有register for two event handlers,以便在用户选择或修改这些内容控件中的文本时收到通知。本例中的相关事件分别为BindingSelectionChanged和BindingDataChanged。

Office.context.document.addHandlerAsync("bindingDataChanged", whenBindingDataChanged);
Office.context.document.addHandlerAsync("bindingSelectionChanged", whenBindingSelected);

当这些事件被触发时,您会想要阅读内容。您可以使用Binding.getDataAsync 方法来做到这一点。

function whenBindingDataChanged(eventArgs)
    eventArgs.binding.getDataAsync(function(asyncResult)
        setValueToDatabaseAsync(eventArgs.binding.id,asyncResult.value);
        // you need to implement setValueToDatabaseAsync
    );

最后,要自己修改Binding的内容,写入初始值,使用Binding.setDataAsync方法。

function displayNumberFromDatabase(myBinding)
    getValueFromDatabaseAsync(myBinding.id, function(value)
        myBinding.setDataAsync(value);
    );
    // you need to implement getValueFromDatabaseAsync

-Michael Saunders,Office 插件产品经理

【讨论】:

嗨迈克尔,感谢你的提示,我写了一个有效的例子!我不明白如何使用绑定,因为我认为它的工作方式不同:您必须编写每个 set 和 get 语句,而通常通过绑定您将控件绑定到对象并且控件反映对象的值,反之亦然。不幸的是,Office Online 似乎不支持 Binding,您有任何消息吗?作为第二个选项,我可以添加一个自定义 XML 部件并在该部件和我的内容控件之间创建一个映射:它是一个选项还是您认为它是一个已弃用的解决方案? 取决于您创建的绑定类型,在线支持文本绑定,其他即将推出。 完美!现在谢谢!

以上是关于Word 加载项中的绑定用法的主要内容,如果未能解决你的问题,请参考以下文章

WORD加载项中有addin,但转换成PDF文件时,仍然提示pdfmaker文件遗失

如何在 C# VSTO Word 加载项中在页码旁边设置页眉和页脚文本?

将 Kivy 列表项中的 on_release 绑定到函数

将菜单添加到加载项中的 Visual Studio 菜单栏

在条件格式中使用加载项中的 UDF

如何在 ThisAddIn 类之外访问 VSTO Outlook 加载项中的应用程序属性?