In Win8.1, if you have a ItemsControl derived type that removes and re-adds some portion of its children and you're using the c:View.Model binding on a data template to convert child view models into their views, you hit an issue.
The issue is this. The OnModelChanged event gets fired every time that the child appears or disappears, which in and of itself would not be bad. However, the following pattern is then employed ...
1. Use the ViewLocator to get the view.
2. Set the ContentProperty on the target to the view.
The problem lies in that the ViewLocator attempts to use a cached view by default and that view is still part of the visual tree. Therefore, the setting the content property fails because the view is already the child of another element in the tree.
This has been tested with several Syncfusion controls that employ this visual hiding/reshowing.
The workaround is to add this override, which trades out the exception (and failure to display the view-model with instead a memory increase as the view keeps being created.
public override object GetView(object context = null) {
return null;
}
Comments: Moved to github
The issue is this. The OnModelChanged event gets fired every time that the child appears or disappears, which in and of itself would not be bad. However, the following pattern is then employed ...
1. Use the ViewLocator to get the view.
2. Set the ContentProperty on the target to the view.
The problem lies in that the ViewLocator attempts to use a cached view by default and that view is still part of the visual tree. Therefore, the setting the content property fails because the view is already the child of another element in the tree.
This has been tested with several Syncfusion controls that employ this visual hiding/reshowing.
The workaround is to add this override, which trades out the exception (and failure to display the view-model with instead a memory increase as the view keeps being created.
public override object GetView(object context = null) {
return null;
}
Comments: Moved to github