Edit and persist serializable Assets in the Editor Window

I have an asset saved in my project which represents a serializable scriptable object (Which is actually a list of base elements).

There is no problem changing values for this object in the inspector, and the changes do persist and survive assembly reloads and exiting/entering unity.

I am trying to mimic the inspector behavior in an Editor Window.

But any changes I do in the Editor Window, though reflected in the Inspector, do not persist.

I am guessing I am loading the asset wrongly in the Editor Window, the asset is loaded in the OnSelectionChange() callback when an asset of the right type is selected.

Any help/ideas would be appreciated.

public class DmgTypeListEditor : EditorWindow
{
	private DmgTypesList m_DmgTypesContainer;

	[MenuItem("GameAssets/DmgTypeEditor")]
    static void Init()
    {
        GetWindow<DmgTypeListEditor>();
    }
	
	 void OnGUI()
    {
		if (m_DmgTypesContainer == null) return;

        if (m_DmgTypesContainer.m_dmgTypeList != null)
        {
            foreach (var item in m_DmgTypesContainer.m_dmgTypeList)
            {
                EditorGUILayout.LabelField(item.dmgType.ToString());
                item._defaultDmgValue = EditorGUILayout.IntField(item._defaultDmgValue);
                item._attackerDescription = EditorGUILayout.TextField(item._attackerDescription);
            }
        }
	}
	
	void OnSelectionChange()
		{
			//Check to see if a database of this type was selected:
			
			Object selectedObject = Selection.activeObject;
			if (selectedObject != null)
			{
				if (selectedObject.GetType() == typeof(DmgTypesList))
				{
					Debug.Log("Selected object is of the right type");
					m_DmgTypesContainer = Selection.activeObject as DmgTypesList;
				}
				else
				{
					Debug.Log("Selected object is NOT of the right type");
				}

			}
		}
		
}

Well after searching and testing I found out that in order to save any changes to the scriptable object in the editor window, I need to do 2 things:

  1. Detect any relevant changes made to the scriptable object in the editor window using the GUI.changed boolean.

  2. Apply those changes with EditorUtility.SetDirty(MyScriptabelObject);

So all I had to do is change my OnGUI() to the following:

 if (m_DmgTypesContainer.m_dmgTypeList != null)
        {

            GUI.changed = false;
            foreach (var item in m_DmgTypesContainer.m_dmgTypeList)
            {
                EditorGUILayout.LabelField(item.dmgType.ToString());
                item._defaultDmgValue = EditorGUILayout.IntField(item._defaultDmgValue);
                item._attackerDescription = EditorGUILayout.TextField(item._attackerDescription);
                
                EditorGUILayout.Space();
            }
            if (GUI.changed)
            {
                //Debug.Log("GUI.changed");
                EditorUtility.SetDirty(m_DmgTypesContainer);
            }
          
        }