Skip to content
Robert B Colton edited this page Aug 12, 2016 · 1 revision

Documents are (usually) displayed in the main area in the middle of the window. To create a new document type, simply inherit from the Document class:

public class SceneViewModel : Document
{
	public override string DisplayName
	{
		get { return "3D Scene"; }
	}

	private Vector3 _position;
	public Vector3 Position
	{
        get { return _position; }
        set
        {
            _position = value;
            NotifyOfPropertyChange(() => Position);
        }
	}
}

To open a document, call OpenDocument on the shell (Shell is defined in ModuleBase, but you can also retrieve it from the IoC container with IoC.Get<IShell>()):

Shell.OpenDocument(new SceneViewModel());

You can then create a SceneView view, and Caliburn Micro will use a convention-based lookup to find the correct view.

Persisted documents

If you have a document that needs to be loaded from, and saved to, a file, you can use the PersistedDocument base class, to remove a lot of the boilerplate code that you would usually have to write. You only need to implement the DoNew, DoLoad, and DoSave methods.

public class EditorViewModel : PersistedDocument
{
	private EditorView _view;
	private string _originalText;

	protected override Task DoNew()
	{
		_originalText = string.Empty;
		ApplyOriginalText();
		return TaskUtility.Completed;
	}

	protected override Task DoLoad(string filePath)
	{
		_originalText = File.ReadAllText(filePath);
		ApplyOriginalText();
		return TaskUtility.Completed;
	}

	protected override Task DoSave(string filePath)
	{
		var newText = _view.textBox.Text;
		File.WriteAllText(filePath, newText);
		_originalText = newText;
		return TaskUtility.Completed;
	}

	private void ApplyOriginalText()
	{
		_view.textBox.Text = _originalText;

		_view.textBox.TextChanged += delegate
		{
			IsDirty = string.Compare(_originalText, _view.textBox.Text) != 0;
		};
	}

	protected override void OnViewLoaded(object view)
	{
		_view = (EditorView) view;
	}
}
Clone this wiki locally