ViewModelBase and DelegateCommands in Sample Code

I’m working on some sample code for some upcoming blog post. There are two classes that are used throughout the examples and will probably be used in future samples. I wanted to mention them here for future blog post. This is applicable to both UWP and WPF projects. The first is the base class that I use for all of my ViewModel classes. 

using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Threading;


namespace Common
{
    public class ViewModelBase
    {

        public static System.Threading.SynchronizationContext SyncContext;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                SendOrPostCallback  a = (o) => { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); };
                if (SyncContext == null)
                    a(null);
                else
                    SyncContext.Send(a, null);
                
            }
        }

        protected void OnPropertyChanged(Expression> expression)
        {
            OnPropertyChanged(((MemberExpression)expression.Body).Member.Name);
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

The field SyncContext is needed for code that runs asynchronously on another thread (for WPF projects this is a Dispatcher instead). If the code attached to PropertyChanged interacts with the UI an exception will occur if this interaction happens on a different thread than the one on which the UI controls were created. When the OnPropertyChanged method is called the SyncContext is used to marshal control back to the UI thread.  One of the OnPropertyChanged methods takes as an argument an expression. I prefer to use this when passing the name of the field being updated to the OnPropertyChange handler because it provides the advantage of compile checking for typos in the name and will be updated if the Rename command is used on a property.  The other frequently used class(es) is the DelegateCommand

using System;
using System.Windows.Input;

namespace Common
{
    public class DelegateCommand : ICommand
    {
        public DelegateCommand(Action execute)
            : this(execute, null)
        {
        }

        public DelegateCommand(Action execute, Func canExecute)
        {
            _execute = execute;
            _canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            if (_canExecute != null)
                return _canExecute();

            return true;
        }

        public void Execute(object parameter)
        {
            _execute();
        }

        public void RaiseCanExecuteChanged()
        {
            if (CanExecuteChanged != null)
                CanExecuteChanged(this, EventArgs.Empty);
        }

        public event EventHandler CanExecuteChanged;

        private Action _execute;
        private Func _canExecute;
    }

    public class DelegateCommand<T> : ICommand
    {
        public DelegateCommand(Action<T> execute)
            : this(execute, null)
        {
        }

        public DelegateCommand(Action<T> execute, Func<T, bool> canExecute)
        {
            _execute = execute;
            _canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            if (_canExecute != null)
            {

                return _canExecute((T)parameter);
            }

            return true;
        }

        public void Execute(object parameter)
        {
            _execute((T)parameter);
        }

        public void RaiseCanExecuteChanged()
        {
            if (CanExecuteChanged != null)
                CanExecuteChanged(this, EventArgs.Empty);
        }

        public event EventHandler CanExecuteChanged;

        private Action<T> _execute;
        private Func<T, bool> _canExecute;
    }
}

The DelegateCommand class is used to make commands that can be bound to a button. This allows us to use DataBinding to associate code with a button through data binding. 

Advertisements

XNA Animated Sprite code uploaded to CodeProject.com

I’ve uploaded some code I was working on to animate sprites in XNA.

Animating a sprite isn’t difficult, but I wanted some way to animate them but reduce the coupling between code and the animation. The Content Pipeline is perfect for this. So I created a component that will handle the animation scenarios that I need along with a content extension so that I could load these animations as content. Right now the animation information is in an XML file. This is a stepping point towards having a graphical tool for handling this.

You can read about the code here or see a brief description of it in the video below

Welcome to the Site Mirror!

It seems that my hosting provider has gone through some changes for the worst; once a week for the past three weeks this site has gone offline because of some failure or data loss at my provider’s location. Because of the decrease in reliability I’ll be looking for a new provider. In the mean time I’ve started mirroring my content at here. Any new content I write will also be published here(I may just use WordPress as the primary host for this site, still undecided). If the main site ever goes down remember you can see the content heretoo.

More than enough?

When it comes to computer resources I’ve always had this philosiphy that you don’t have enough until you have more than enough. That philosiphy worked out fine for me in the desktop days when the cost in space and power consumption were unnoticable. But now with all my machines (save one) being portables, it makes a big difference.

The laptop I use for work is a Dell Precision M6400. I received the machine with 4 gigs of ram and a measley 160 gig hard drive. The machine had empty memory slots and an empty drive slot. So I bumped the ram up to 12 gigs and added a second (500 gig) drive. ¬†Adding the RAM solved a performance problem I was having; 4 gigs just wasn’t enough for the virtual machines I needed to run and for multiple instances of Visual Studio. But now that I have the RAM the machine runs much hotter. When it comes out of the hibernate state I’ve got to wait for a 12 gig hibernation file to open. If I put it in standby it won’t last a full day before the battery dies. With the extra drive and the RAM together its hard to make this machine last much longer than 20 minutes on battery power. I didn’t think I’d ever say this but I don’t plan to ever max this machins RAM or storage out in light of the tradeoffs of doing so. I’m going to take the original hard drive out.

The lesson I learned from this is that everything has it’s cost, even having more than enough.

New Hardware: Samsung Galaxy Tab

If you follow me on Twitter you’ll know I’ve been looking for a new tablet device. I’ve made my decision. I was originally going to get a Windows tablet. But when I looked at the available tablets I found that the emphasis seems to be on making them smaller and lighter and as a consequence they are lower powered than what I have with longer battery life. I get pretty good battery life already, so there wasn’t a big incentive for me to get a new Windows tablet just yet. Mine is good enough.

For a breif moment I considered the iPad 2 but the new unit looks to be an incremental upgrade from the original. So I’m leaving it alone.

Next on the list was an Android tablet. That’s what I got, a Samsung Galaxy Tab. It’s a nifty little device in it’s own right. It’s small enough to fit in one hand or the back pocket of some jeans (not that I recommend carrying that way, to many pick pockets around) but large enough to make for a good eBook reader. I was also pleased with how consistent it is with other Samsung devices. I’ll be talking more about it (and another mobile operating system!) in the coming weeks.

iOS Firmware Expired?

This always happens to me. After installing a beta/pre release version of iOS I forget to install the final version when it comes out and the firmware expires. Unlike regular firmware updates I’ve never been prompted by iTunes to perform an update of the firmware when a release version is available. It seems that one has to download it and install it manually. When the firmware expires you end up with a device that has all of the notifications and reminders still showing up but the inability to get to the applications producing those notifications or reminders.

Anyway, this happened to me again the other day. I didn’t feel like addressing it then, but now that I’ve got the time I’m downloading the updated firmware (manually) to install. I found the site iPhoneFirmware.com which keeps track of the direct links to all of the iOS device firmware. Makes it much easier to find what I need. On the downside this looks to be a 30 minute download, so I’ll go do some other development for a while.