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

Silverlight Simple Drag And Drop / Or Browse View Model / MVVM File Upload Control

Rate me:
Please Sign up or sign in to vote.
4.96/5 (28 votes)
25 Jun 2011Ms-PL3 min read 107.1K   2.9K   54  
An example of a Silverlight Drag And Drop / Or Browse File Upload Control using View Model / MVVM
// Copyright (c) 2010
// by OpenLight Group
// http://openlightgroup.net/
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions 
// of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
//
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Data;
using System.ComponentModel;
using System.IO;
using System.Windows.Input;
using System.Windows;

namespace SimpleMVVMFileUpload
{
    public class ADefUploadControlViewModel : INotifyPropertyChanged
    {
        public Uri UploadUrl { get; set; }

        public ADefUploadControlViewModel()
        {
            // Set the command property
            UploadFileCommand = new DelegateCommand(UploadFile, CanUploadFile);
        }

        // Commands

        #region UploadFileCommand
        public ICommand UploadFileCommand { get; set; }
        public void UploadFile(object param)
        {
            // Can only upload if there is a selected File
            if (SelectedFileProperty != null)
            {         
                // Turn on Uploading Flag
                Uploading = true;

                UploadFile();
            }
        }

        private bool CanUploadFile(object param)
        {
            // Only allow uploading if not already uploading
            return (Uploading != true);
        }
        #endregion

        // Properties

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

        #region SelectedFileProperty
        private FileInfo _SelectedFileProperty;
        public FileInfo SelectedFileProperty
        {
            get
            {
                return _SelectedFileProperty;
            }
            set
            {
                if (SelectedFileProperty == value)
                {
                    return;
                }
                _SelectedFileProperty = value;
                this.NotifyPropertyChanged("SelectedFileProperty");
            }
        }
        #endregion

        #region SelectedFileNameProperty
        private string _SelectedFileNameProperty = "File Name";
        public string SelectedFileNameProperty
        {
            get
            {
                return _SelectedFileNameProperty;
            }
            set
            {
                if (SelectedFileNameProperty == value)
                {
                    return;
                }
                _SelectedFileNameProperty = value;
                this.NotifyPropertyChanged("SelectedFileNameProperty");
            }
        }
        #endregion

        #region FileuploadPercentProperty
        private string _FileuploadPercentProperty;
        public string FileuploadPercentProperty
        {
            get
            {
                return string.Format("{0} %", this._FileuploadPercentProperty);
            }
            set
            {
                this._FileuploadPercentProperty = value;
                this.NotifyPropertyChanged("FileuploadPercentProperty");
            }
        }
        #endregion

        #region MainViewModell_VM
        private MainViewModel _MainViewModell_VM;
        public MainViewModel MainViewModell_VM
        {
            get
            {
                return _MainViewModell_VM;
            }
            set
            {
                if (MainViewModell_VM == value)
                {
                    return;
                }
                _MainViewModell_VM = value;
                this.NotifyPropertyChanged("MainViewModell_VM");
            }
        }
        #endregion

        // Upload File

        #region UploadFile
        private void UploadFile()
        {
            // If there is a file upload it
            if (SelectedFileProperty != null)
            {
                // Get the upload URL
                string strURLWithSelectedFolder = string.Format("{0}", GetWebserviceAddress());
                Uri uri = new Uri(strURLWithSelectedFolder, UriKind.Absolute);
                UploadUrl = uri;

                // Create an FileUpload object
                FileUpload upload = new FileUpload(App.Current.RootVisual.Dispatcher, UploadUrl, SelectedFileProperty);
                upload.ChunkSize = 4194304;

                // Wire up handles for status changed and upload percentage
                // These will be updating the properties that the ViewModel exposes
                upload.StatusChanged += new EventHandler(upload_StatusChanged);
                upload.UploadProgressChanged += new ProgressChangedEvent(upload_UploadProgressChanged);

                // Start the Upload
                upload.Upload();
            }
        }
        #endregion

        // Uploading Events

        #region upload_UploadProgressChanged
        void upload_UploadProgressChanged(object sender, UploadProgressChangedEventArgs args)
        {
            // Update the progress percentage
            FileuploadPercentProperty = args.ProgressPercentage.ToString();
        }
        #endregion

        #region upload_StatusChanged
        void upload_StatusChanged(object sender, EventArgs e)
        {
            FileUpload fu = sender as FileUpload;
            
            // Is upload complete?
            if (fu.Status == FileUploadStatus.Complete)
            {                
                // Clear the Selected File
                SelectedFileProperty = null;

                // Turn off Uploading Flag
                Uploading = false;

                // Refresh Files on the Main page
                MainViewModell_VM.GetFilesCommand.Execute(null);
            }
        }
        #endregion

        // Utility

        #region GetWebserviceAddress
        private string GetWebserviceAddress()
        {
            string strXapFile = @"/ClientBin/SimpleMVVMFileUpload.xap";

            string strBaseWebAddress =
                App.Current.Host.Source.AbsoluteUri.Replace(strXapFile, "");

            return string.Format(@"{0}/{1}", strBaseWebAddress, @"WebService/FileUpload.ashx");
        }
        #endregion

        #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