diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index ea6c3741e5e02fbbbc9fe2331d08fbfc887a6085..21ff1abfe66c51a4abfea02654343afb25115eb8 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -1002,6 +1002,11 @@ protected:
         return (cursorPositionEnd >= begin && cursorPositionStart <= end);
     }
 
+    bool isRangeSelected() const
+    {
+        return (cursorPositionStart != cursorPositionEnd);
+    }
+
     virtual void postVisit(Node *ast)
     {
         if ((cursorPositionStart == cursorPositionEnd && !selectedMembers.isEmpty()))
@@ -1011,12 +1016,13 @@ protected:
             unsigned begin = member->firstSourceLocation().begin();
             unsigned end = member->lastSourceLocation().end();
 
-            if ((cursorPositionStart != cursorPositionEnd && intersectsCursor(begin, end))
-             || (cursorPositionStart == cursorPositionEnd && containsCursor(begin, end)))
+            if ((isRangeSelected() && intersectsCursor(begin, end))
+            || (!isRangeSelected() && containsCursor(begin, end)))
             {
                 if (UiObjectInitializer *init = initializer(member)) {
                     for (UiObjectMemberList *it = init->members; it; it = it->next) {
-                        if (isAcceptableParent(member)) {
+                        if ((isRangeSelected() && isAcceptableParent(member))
+                         || (!isRangeSelected() && isIdBinding(it->member))) {
                             selectedMembers << member;
                             // move start towards end; this facilitates multiselection so that root is usually ignored.
                             cursorPositionStart = qMin(end, cursorPositionEnd);