WinJS绑定到C#Windows运行时组件类

时间:2013-04-22 15:59:18

标签: windows-runtime windows-store-apps winjs windows-store

我似乎无法在我的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>

1 个答案:

答案 0 :(得分:3)

在WinJS中,唯一可绑定的对象/属性是使用WinJS API标记为Observable的对象/属性。这类似于数据绑定在XAML / C#中的工作方式,因为您需要实现INotifyPropertyChanged。

由于您创建的WinRT对象是密封的,因此无法扩展它以使其在您理解的上下文中可观察到。

我过去完成此操作的方法是创建JavaScript包装类,根据需要处理与WinRT类型的转换(对我们来说,从托管代码进行数据服务调用)。