我似乎无法在我的WinJS View代码和我的Windows运行时组件ViewModel代码之间进行数据绑定。有关这个问题的网站的任何建议或指示吗?
我来自Xaml / C#背景,但需要制作我的UI(又名视图)HTML / WinJS。所以我将HTML / WinJS视为类似于Xaml + C#-Codebehind的View。但我希望其他所有内容都使用C#代码编写。因此,我正在从Windows运行时组件项目中创建我的ViewModel,并在WinJS中设置一个局部变量来表示ViewModel的一个实例。但是,当我尝试绑定到ViewModel上的简单字符串属性时,我得到以下javascript异常:
ms-appx://microsoft.winjs.1.0/js/base.js第8行第8652行的JavaScript库代码将捕获异常 0x800a13d5 - JavaScript运行时错误:无法定义属性'_getObservable':对象不可扩展 文件:base.js,行:8652,列:17
以下是我的home.js文件中的代码,它获取ViewModel实例并处理绑定:
(function () {
"use strict";
var _viewModel;
WinJS.UI.Pages.define("/pages/home/home.html", {
// This function is called whenever a user navigates to this page. It
// populates the page elements with the app's data.
ready: function (element, options) {
// TODO: Initialize the page here.
_viewModel = ViewModels.ViewModelLocator.viewModelTest;
WinJS.Namespace.define("Application.Pages.Home", { "ViewModel": _viewModel });
WinJS.Binding.processAll(null, Application.Pages.Home.ViewModel);
}
});
})();
以下是带有data-win-bind属性的简单home.html代码:
<section aria-label="Main content" role="main" data-win-bindsource="Application.Pages.Home">
<h2 data-win-bind="innerText: ViewModel.testString"></h2>
<h3>Test String Property: <span data-win-bind="innerText: testString"></span></h3>
<button id="changeTestStringButton">Change testString value</button>
</section>
答案 0 :(得分:3)
在WinJS中,唯一可绑定的对象/属性是使用WinJS API标记为Observable的对象/属性。这类似于数据绑定在XAML / C#中的工作方式,因为您需要实现INotifyPropertyChanged。
由于您创建的WinRT对象是密封的,因此无法扩展它以使其在您理解的上下文中可观察到。
我过去完成此操作的方法是创建JavaScript包装类,根据需要处理与WinRT类型的转换(对我们来说,从托管代码进行数据服务调用)。