Calling tries to lazy load in every properties getter
There is the INotifyPropertyChanged event handler, but I'm not sure why you would need that in this case?  Instead why not just load the details when the ID changes as that seems to be the only value that will change between LoadDetails calls.

Perhaps something like:

public int ID
{
    get { return m_nOID; }
    set {

       if(m_NOID != value) {
          InitialiseUserDetails(m_nOID);
       }

       m_nOID = value; 
    }
}


If this was ok, you could remove the private backing fields as I believe you wish to do.