/// <summary>
        /// Update _contact from the UI.
        /// </summary>
        private void UpdateContactFromFields()
        {
            #if PLATFORM_LUMIN
            _contact.Name = _nameField.Text;

            _contact.PhoneNumberList.Items.Clear();
            foreach (GameObject item in _phoneNumberGOList)
            {
                ContactAttributeItemVisualizer attributeItem = item.GetComponent <ContactAttributeItemVisualizer>();
                _contact.PhoneNumberList.Items.Add(attributeItem.Attribute);
            }

            _contact.EmailAddressList.Items.Clear();
            foreach (GameObject item in _emailAddressGOList)
            {
                ContactAttributeItemVisualizer attributeItem = item.GetComponent <ContactAttributeItemVisualizer>();
                _contact.EmailAddressList.Items.Add(attributeItem.Attribute);
            }
            #endif
        }
        /// <summary>
        /// Deletes all the UI fields and rebuilds them based on _contact.
        /// Any unsaved changes on the fields will be lost. Call UpdateContactFromFields()
        /// before calling Refresh() if changes needed to be saved.
        /// </summary>
        private void Refresh()
        {
            DestroyListItems();

            #if PLATFORM_LUMIN
            _nameField.Text = _contact.Name;
            #endif

            _nameField.enabled = IsEditing;

            float       yOffset    = 0.01f;
            const float xOffset    = -0.25f;
            const float yOffsetInc = -0.03f;

            #if PLATFORM_LUMIN
            for (int i = 0; i < _contact.PhoneNumberList.Count; ++i)
            {
                MLContacts.TaggedAttribute phoneNumber = _contact.PhoneNumberList.Items[i];
                GameObject itemGO = Instantiate(_attributeItem.gameObject, transform);
                itemGO.transform.localPosition = new Vector3(xOffset, yOffset, 0);
                yOffset += yOffsetInc;

                ContactAttributeItemVisualizer item = itemGO.GetComponent <ContactAttributeItemVisualizer>();
                item.ContactPageVisualizer = this;
                item.Attribute             = phoneNumber;
                item.ListIndex             = i;
                item.DeleteCommand         = RemovePhoneNumber;

                _phoneNumberGOList.Add(itemGO);
            }
            #endif

            _addPhoneButton.gameObject.SetActive(IsEditing);
            _addPhoneButton.transform.localPosition = new Vector3(xOffset, yOffset, 0);

            if (IsEditing)
            {
                yOffset += 2 * yOffsetInc;
            }
            #if PLATFORM_LUMIN
            else if (_contact.PhoneNumberList.Count > 0)
            {
                yOffset += yOffsetInc;
            }

            for (int i = 0; i < _contact.EmailAddressList.Count; ++i)
            {
                MLContacts.TaggedAttribute emailAddress = _contact.EmailAddressList.Items[i];
                GameObject itemGO = Instantiate(_attributeItem.gameObject, transform);
                itemGO.transform.localPosition = new Vector3(xOffset, yOffset, 0);
                yOffset += yOffsetInc;

                ContactAttributeItemVisualizer item = itemGO.GetComponent <ContactAttributeItemVisualizer>();
                item.ContactPageVisualizer = this;
                item.Attribute             = emailAddress;
                item.ListIndex             = i;
                item.DeleteCommand         = RemoveEmailAddress;

                item.enabled = IsEditing;

                _emailAddressGOList.Add(itemGO);
            }
            #endif

            _addEmailButton.gameObject.SetActive(IsEditing);
            _addEmailButton.transform.localPosition = new Vector3(xOffset, yOffset, 0);
        }