From 7e6afa603fb5d82c7fcd441e96e1d3a9bd3fc10e Mon Sep 17 00:00:00 2001 From: Nedyalko Nikolov Date: Fri, 14 Aug 2015 12:11:41 +0300 Subject: [PATCH] Fixed issue with binding gestures to repeater items. --- CrossPlatformModules.csproj | 2 ++ apps/tests/ui/bindable-tests.ts | 27 +++++++++++++++++++ .../ui/repeaterItems-bindingToGestures.ts | 14 ++++++++++ .../ui/repeaterItems-bindingToGestures.xml | 9 +++++++ ui/repeater/repeater.ts | 2 +- 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 apps/tests/ui/repeaterItems-bindingToGestures.ts create mode 100644 apps/tests/ui/repeaterItems-bindingToGestures.xml diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj index cc8cdd942..a699a8792 100644 --- a/CrossPlatformModules.csproj +++ b/CrossPlatformModules.csproj @@ -147,6 +147,7 @@ + @@ -898,6 +899,7 @@ + diff --git a/apps/tests/ui/bindable-tests.ts b/apps/tests/ui/bindable-tests.ts index 85c617145..fcefcf755 100644 --- a/apps/tests/ui/bindable-tests.ts +++ b/apps/tests/ui/bindable-tests.ts @@ -14,6 +14,9 @@ import labelModule = require("ui/label"); import textFieldModule = require("ui/text-field"); import fs = require("file-system"); import appModule = require("application"); +import repeaterModule = require("ui/repeater"); +import gestureModule = require("ui/gestures"); +import layoutBaseModule = require("ui/layouts/layout-base"); // // For information and examples how to use bindings please refer to special [**Data binding**](../../../../bindings.md) topic. @@ -528,6 +531,30 @@ export var test_BindingContext_NavigatingForwardAndBack = function () { helper.navigateToModuleAndRunTest(("." + moduleName + "/bindingContext_testPage1"), null, testFunc); } +export var test_RepeaterItemsGestureBindings = function () { + var testFunc = function (page: pageModule.Page) { + var repeater = (page.getViewById("repeater")); + var hasObservers = false; + var eachChildCallback = function (childItem: viewModule.View) { + if (childItem instanceof labelModule.Label) { + var gestureObservers = childItem.getGestureObservers(gestureModule.GestureTypes.tap); + hasObservers = gestureObservers ? gestureObservers.length > 0 : false; + } + else if (childItem instanceof layoutBaseModule.LayoutBase) { + childItem._eachChildView(eachChildCallback); + } + return true; + } + + repeater._eachChildView(eachChildCallback); + + TKUnit.assertEqual(hasObservers, true, "Every item should have tap observer!"); + } + + var moduleName = __dirname.substr(fs.knownFolders.currentApp().path.length); + helper.navigateToModuleAndRunTest(("." + moduleName + "/repeaterItems-bindingToGestures"), null, testFunc); +} + export var test_BindingToSource_FailsAfterBindingContextChange = function () { var createLabel = function () { var label = new labelModule.Label(); diff --git a/apps/tests/ui/repeaterItems-bindingToGestures.ts b/apps/tests/ui/repeaterItems-bindingToGestures.ts new file mode 100644 index 000000000..61f1cf3aa --- /dev/null +++ b/apps/tests/ui/repeaterItems-bindingToGestures.ts @@ -0,0 +1,14 @@ +function pageLoaded(args) { + var page = args.object; + page.bindingContext = { + items: [ + { text: "1", tapItem: function () { console.log("1") } }, + { text: "2", tapItem: function () { console.log("2") } } + ] + }; +} +exports.pageLoaded = pageLoaded; + +exports.tapPage = function (args) { + console.log("Tap! " + args + " " + args.object); +} \ No newline at end of file diff --git a/apps/tests/ui/repeaterItems-bindingToGestures.xml b/apps/tests/ui/repeaterItems-bindingToGestures.xml new file mode 100644 index 000000000..12b04ea7e --- /dev/null +++ b/apps/tests/ui/repeaterItems-bindingToGestures.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/ui/repeater/repeater.ts b/ui/repeater/repeater.ts index bd9c18ede..02849944c 100644 --- a/ui/repeater/repeater.ts +++ b/ui/repeater/repeater.ts @@ -149,8 +149,8 @@ export class Repeater extends viewModule.CustomLayoutView implements definition. for (i = 0; i < this.items.length; i++) { var viewToAdd = !types.isNullOrUndefined(this.itemTemplate) ? builder.parse(this.itemTemplate, this) : this._getDefaultItemContent(i); if (!types.isNullOrUndefined(viewToAdd)) { - this.itemsLayout.addChild(viewToAdd); viewToAdd.bindingContext = this._getDataItem(i); + this.itemsLayout.addChild(viewToAdd); } } }