My motivation is to transition things that were written in WinForms to WPF. The problem is that I won't have a huge block of time to transition an entire tool to WPF. I'd take the approach of converting a particular control (i.e., property editor) and replacing it in our set of tools, then doing some other non-tools work for a few months, then come back and replace a core control (say the circuit drawing part of the circuit editor) when we have time / priority.
Object Generation:
The main point centers around what you expose and what basic types you support. There are three main types that I saw: Basic fields (int's, object's, etc), Lists (represented as ObservableCollection<>'s), and Dictionaries (which were...interesting). It doesn't look like Dict's are supported in DOM? So you will likely dodge a bullet there.
The basic format was also pretty simple. Let's say you had some type 'Foo'. I'll talk about how our types related with 'FooNPC' being derived from INotifyPropertyChanged, and 'FooNode' being the Schema Generated one (equivalent to the DomNode).
Creation:
We allowed you to either create a new FooNPC but you had to specify a File that it was created in. I'd see this equivalent to the DomDocument? It'd internally create a DomNode for you and subscribe to events, then raise the events for a new Node being added to the Document. There were some tricky bits here if you needed to create all your sub-objects, and make sure the events were raised appropriately.
Additionally, if you somehow got a Node, we allowed you to simply wrap an existing FooNode with a FooNPC, and it just worked.
Exposure:
We defaulted to exposing all 'real' properties on the FooNode in the FooNPC, but also a quick access to the FooNode itself, if you needed to do something 'weird'. Most of the time accessing the FooNPC was enough.
The interesting point here was 'How do we expose the attributes on the Properties?' since we often used them in our template selectors and controls. I believe we ended up with just another Dict<string, List<FieldAttribute>> with the field name being the Key. We also had another list of attributes exposed for the Type as well. It's interesting to me because we effectively created another meta data system to access these things. Perhaps we could so something better here?
Additionally, I didn't particularly like working with the Dict. I'd've preferred a class that was all the attributes (I mean, we are code genning, right?) as pure fields themselves (i.e., class FooFieldAttributes{ public bool IsFile; public string FileInitialDirectory; public ColorEnum ColorType; } ) This attr class would help with binding to controls that need things like InitialDirectory for a FilePicker control.
We also made the FooNPC a partial class so we could extend it in simple ways in a sister C# file. (Providing some simple sorting functions, for example.) The point was that the bare minimum class wasn't always sufficient to work with as pure data.
Resulting Code:
The nice thing was that a command could just do 'var obj = new FooNPC(App.CurrentDocument, "NewFooObject");' and then do 'obj.Field = 184.0f' which was very nice for random folks supporting us (Game Programmers / Tech Art). Or just have a ListView in XAML bind directly to the object list, e.g. {Binding Path="SomeList"} then write some DataTemplate's, and implement 'add item' and 'remove item' commands and be done.
Another nice thing was: If tools code depended on a field existing, and the format was changed (field removed or something), the code would have compile errors which were obvious.
We also took advantage of having static strings for PropertyNames so we could respond to OnPropertyChanged() easily too.
Does that all make sense?
We also had to deal with a bunch of crazy other things (ownership (and correct cloning), communicating over a network connection, multiple clients) but they are all a bit beside the point.