/// <summary> /// Given the type of a model, locate the type of its View (or throw an exception) /// </summary> /// <param name="modelType">Model to find the view for</param> /// <returns>Type of the ViewModel's View</returns> protected virtual Type LocateViewForModel(Type modelType) { var modelName = modelType.FullName; var viewName = this.ViewTypeNameForModelTypeName(modelName); if (modelName == viewName) { throw new StyletViewLocationException(String.Format("Unable to transform ViewModel name {0} into a suitable View name", modelName), viewName); } // Also include the ViewModel's assembly, to be helpful var viewType = this.ViewTypeForViewName(viewName, new[] { modelType.Assembly }); if (viewType == null) { var e = new StyletViewLocationException(String.Format("Unable to find a View with type {0}", viewName), viewName); logger.Error(e); throw e; } else { logger.Info("Searching for a View with name {0}, and found {1}", viewName, viewType); } return(viewType); }
/// <summary> /// Given a ViewModel instance, locate its View type (using LocateViewForModel), and instantiates it /// </summary> /// <param name="model">ViewModel to locate and instantiate the View for</param> /// <returns>Instantiated and setup view</returns> public virtual UIElement CreateViewForModel(object model) { var viewType = this.LocateViewForModel(model.GetType()); if (viewType.IsAbstract || !typeof(UIElement).IsAssignableFrom(viewType)) { var e = new StyletViewLocationException(String.Format("Found type for view: {0}, but it wasn't a class derived from UIElement", viewType.Name), viewType.Name); logger.Error(e); throw e; } var view = (UIElement)this.ViewFactory(viewType); this.InitializeView(view, viewType); return(view); }