/// <summary>
 /// Set a property value on an object and notify that it changed only if it changed
 /// </summary>
 /// <typeparam name="T">The type the field and the value are</typeparam>
 /// <param name="sender">The object that the field is being set on</param>
 /// <param name="field">The field that will be changing</param>
 /// <param name="value">The new value for the field</param>
 /// <param name="before">The action that should be performed before the value is set</param>
 /// <param name="after">The action that should be performed after the value is set</param>
 /// <param name="properties">The property names of the properties that have changed</param>
 public static void SetAndNotify <T>(this INotifyPropertyChanged sender, ref T field, T value, Action before, Action after, params string[] properties)
 {
     if (sender != null && sender.Set(ref field, value, before, after))
     {
         sender.OnPropertyChanged(properties);
     }
 }
 public static void SetModel <T>(this INotifyPropertyChanged viewModel, T model)
 {
     using (viewModel.Suspend())
     {
         var token = viewModel.Get <SuspenderToken>("EntityNullToken");
         if (token != null && model != null)
         {
             token.Dispose();
         }
         if (viewModel.Set(model, "Model"))
         {
             if (model == null)
             {
                 viewModel.Set <SuspenderToken>(viewModel.Suspend(), "EntityNullToken");
             }
         }
     }
 }
 public static void SetLinked <T>(this INotifyPropertyChanged viewModel, T view)
 {
     using (viewModel.Suspend())
     {
         var token = viewModel.Get <SuspenderToken>("EntityNullToken");
         if (token != null && viewModel != null)
         {
             token.Dispose();
         }
         if (viewModel.Set(view, "Linked"))
         {
             //if (model == null) viewModel.Set<SuspenderToken>(viewModel.Suspend(), "EntityNullToken");
         }
     }
 }