title: Debounce event/command in MVVM pattern
body: <p>I am in the process of building a universal windows application using Caliburn.Micro, unfortunately due to certain hardware limitations we are needing to target Windows 10 1607 so cannot implement any packages with dependencies on .NET Standard / UWP 16299, this includes ReactiveUI.</p>
  
  <p>In this particular scenario, I have a view-model first approach which generates a map (and some other resources), these are then bound to a mapview in the XAML view. Ideally, I want to trigger a process when the map is moved via the <code>ViewpointChanged</code> event.</p>
  
  <p><strong>View Model</strong></p>
  
  <pre><code>public class ExampleViewModel : Screen
  {
      public ExampleViewModel()
      {
          Map = new Map();
      }
  
      public Map Map { get; set; }
      public BindableCollection&lt;MapItems&gt; MapItems { get; set; }
  
      private UpdateMapItems(Envelope visibleArea)
      {
          // The visibleArea param will include the current viewpoint of the map view
          // This method will effectively generate the appropriate map items based on the current coordinates
      }
  }
  </code></pre>
  
  <p><strong>View</strong></p>
  
  <pre><code>...
  &lt;MapView x:Name="MapView" Map="{Binding Map}" cal:Message.Attach="[Event ViewpointChanged] = [Action UpdateMapItems(MapView.VisibleArea.Extent)]" /&gt;
  ...
  </code></pre>
  
  <p>Now this <em>technically</em> works but has a major flaw in that each movement of the map fires the ViewpointChanged event several times (similar effect to that of OnMouseMove for example).</p>
  
  <p>Ideally I'd like to be able to throttle/debounce this event so that the map items are only processed when the view hasn't been moved for say 300ms.</p>
  
  <p>I found an article that involved implementing a <code>DispatcherTimer</code> however elements of this code such as the <code>DispatcherPriority</code> and <code>Dispatcher</code> don't seem to be available in UWP so unless alternatives exist, I don't think this will work.</p>
  
  <p>I have had a look at System.Reactive but this seemed exceptionally complicated for what I'm looking to achieve.</p>
  
  <p>Any pointers would be very appreciated!</p>