Click here to Skip to main content
15,895,084 members
Articles / Programming Languages / C# 4.0

Silverlight Unsaved Data Detection

Rate me:
Please Sign up or sign in to vote.
4.84/5 (16 votes)
4 Oct 2010Ms-PL4 min read 84.9K   437   19  
Detect that a user has un-saved changes and popup a box that allows them to stop navigating away from the page (using ViewModel / MVVM)
  • unsaveddatadetection.zip
    • UnsavedDataDetection.sln
    • UnsavedDataDetection.Web
    • UnsavedDataDetection
      • App.xaml
      • App.xaml.cs
      • Assets
      • Bin
        • Debug
          • AppManifest.xaml
          • ar
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • bg
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • ca
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • cs
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • da
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • de
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
          • el
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • es
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
          • et
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • eu
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • fi
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • fr
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
          • he
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • hr
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • hu
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • id
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • it
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
          • ja
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
          • ko
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
          • lt
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • lv
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • ms
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • nl
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • no
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • pl
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • pt
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • pt-BR
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • ro
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • ru
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
          • sk
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • sl
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • sr-Cyrl-CS
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • sr-Latn-CS
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • sv
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • System.ComponentModel.DataAnnotations.dll
          • System.ComponentModel.DataAnnotations.xml
          • System.Windows.Controls.Data.dll
          • System.Windows.Controls.Data.Input.dll
          • System.Windows.Controls.Data.Input.xml
          • System.Windows.Controls.Data.xml
          • System.Windows.Controls.dll
          • System.Windows.Controls.Input.dll
          • System.Windows.Controls.Input.xml
          • System.Windows.Controls.Navigation.dll
          • System.Windows.Controls.Navigation.xml
          • System.Windows.Controls.xml
          • System.Windows.Data.dll
          • System.Windows.Data.xml
          • TestPage.html
          • th
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • tr
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • uk
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • UnsavedDataDetection.dll
          • UnsavedDataDetection.xap
          • vi
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.resources.dll
          • zh-Hans
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
          • zh-Hant
            • System.ComponentModel.DataAnnotations.resources.dll
            • System.Windows.Controls.Data.Input.resources.dll
            • System.Windows.Controls.Data.resources.dll
            • System.Windows.Controls.Input.resources.dll
            • System.Windows.Controls.Navigation.resources.dll
            • System.Windows.Controls.resources.dll
            • System.Windows.Data.resources.dll
        • Release
      • Classes
      • MainPage.xaml
      • MainPage.xaml.cs
      • Properties
      • UnsavedDataDetection.csproj
      • UnsavedDataDetection.csproj.user
      • ViewModels
      • Views
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Data;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.Linq;
using System.Reflection;

namespace UnsavedDataDetection
{
    public class HomeViewModel : INotifyPropertyChanged
    {
        public HomeViewModel()
        {
            // Set the command property
            SaveCommand = new DelegateCommand(Save, CanSave);

            // Wire-up property changed event handler
            PropertyChanged += new PropertyChangedEventHandler(HomeViewModel_PropertyChanged);

            // Set default values
            FullName = "John Doe";
            Email = "JohnDoe@Whitehouse.gov";
        }

        // Commands

        #region SaveCommand
        public ICommand SaveCommand { get; set; }
        public void Save(object param)
        {
            // Clear IsDirty Flag 
            // (normally you would actually perform a save first)

            // Get an instance of the App class
            App AppObj = (App)App.Current;

            // Clear all the ISDirty flags
            AppObj.objApplicationState.ClearIsDirty();

            // Set IsDirty on this class
            IsDirty = false;
        }
        private bool CanSave(object param)
        {
            // Only enable if form is Dirty
            return (IsDirty);
        } 
        #endregion

        // Properties

        #region IsDirty
        private bool _IsDirty;
        public bool IsDirty
        {
            get { return _IsDirty; }
            set
            {
                if (IsDirty == value)
                {
                    return;
                }
                _IsDirty = value;
                this.NotifyPropertyChanged("IsDirty");
            }
        }
        #endregion

        #region FullName
        private string _FullName;
        public string FullName
        {
            get { return _FullName; }
            set
            {
                if (FullName == value)
                {
                    return;
                }
                _FullName = value;
                this.NotifyPropertyChanged("FullName");
            }
        }
        #endregion

        #region Email
        private string _Email;
        public string Email
        {
            get { return _Email; }
            set
            {
                if (Email == value)
                {
                    return;
                }
                _Email = value;
                this.NotifyPropertyChanged("Email");
            }
        }
        #endregion

        // Events

        #region HomeViewModel_PropertyChanged
        void HomeViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            // Run this method for any property other than the IsDirty property
            // otherwise you will be in in infinate loop
            if (e.PropertyName != "IsDirty")
            {
                // Create a new ApplicationElement
                ApplicationElement objApplicationElement = new ApplicationElement();
                objApplicationElement.ElementKey = string.Format("HomeViewModel_{0}", e.PropertyName);
                objApplicationElement.ElementName = e.PropertyName;

                // Set ElementCurrentValue
                PropertyInfo pi = this.GetType().GetProperty(e.PropertyName);
                objApplicationElement.ElementCurrentValue = Convert.ToString(pi.GetValue(this, null));

                // Get an instance of the App class
                App AppObj = (App)App.Current;
                // Add the ApplicationElement to the objApplicationState object
                AppObj.objApplicationState.AddElement(objApplicationElement);

                // Set IsDirty
                IsDirty = (AppObj.objApplicationState.Elements.Where(x => x.IsDirty == true).Count() > 0);
            }
        }
        #endregion

        // Utility

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
        #endregion
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)


Written By
Software Developer (Senior) http://ADefWebserver.com
United States United States
Michael Washington is a Microsoft MVP. He is a ASP.NET and
C# programmer.
He is the founder of
AiHelpWebsite.com,
LightSwitchHelpWebsite.com, and
HoloLensHelpWebsite.com.

He has a son, Zachary and resides in Los Angeles with his wife Valerie.

He is the Author of:

Comments and Discussions