Simple example:
I have VM with hierarchical item structure and I have designed View containing TreeView. Each tree node corresponds to data item related to the one in the Model.
GUI must respect user preferences and settings and store different parameters including whether each particular node is expanded or not. As long as every node relates to some data we need to tie View settings with the Model. I beleive it’s not OK to define property IsExpanded in the class standing for the Model.
So where should I store the settings so they stayed consistent with the data?
I was in a similar situation, here’s what I did to solve it.
Each ViewModel node had an IsExpanded property, which was bound to the TreeViewItem’s IsExpanded property. I didn’t want to persist the state of the tree by storing it in the Model in IsExpanded properties (it’s to do with visual state right?). So instead, I had the VM tree structure generate a dictionary that stored the expansion state for each node against a string key generated from the node’s state in the tree:
Dictionary<string, bool> treeExpandedStatesEach node in the tree had an ID, so in my case the key was something like “/1/3/7”, but anything unique will do. This Dictionary was then serialized to a file on application close (in actual fact it was a SerializableDictionary). Then on application restart, it was deserialized and used to set the expansion state after the hierarchy had been loaded back up. This meant that the state of the tree was exactly as the user had left it, but nothing was stored in the Model.