In the 'OnDrag' event you need to check the current Y co-ordinate is within your bounds, and then perform an update to the Top value only if the values are in the desired range.
In the StopDrag event, you will need to calculate the correct position for an item in this rank, and set the 'Top' value of the object to the required value to make it 'snap' to the right position.
The issue that I can see is that the events doing the handling of the drag and drop are inside your Marker class and not aware of the global environment, thus stopping you writing code such as 'if (this.Y < lowerY || this.Y > upperY) then do nothing. There are a number of solutions to this: move the drag event handlers onto the parent container so they are aware of the data required, make the parent container have some form of globally visible properties which are visible from within the scope of one of the markers, or possibly add a property to each marker that allows them to be aware of their parent 'container'.