private void BindProperty(BaseDefinition source, FrameworkElement boundElement, string sourcePropertyName, DependencyProperty property, IValueConverter converter = null)
        {
            Binding binding = new Binding(sourcePropertyName);

            binding.Source = source;
            binding.Mode   = BindingMode.OneWay;
            if (converter != null)
            {
                binding.Converter = converter;
            }
            boundElement.SetBinding(property, binding);
        }
        public FrameworkElement ExtractAndBind(BaseDefinition model)
        {
            Type             ElementType = TypeDictionary[model.GetType()];
            FrameworkElement UIElement   = ControlFactory.CreateControl(ElementType);

            PropertyInfo[] properties = model.GetType().GetProperties();
            foreach (var property in properties)
            {
                object             value = property.GetValue(model);
                DependencyProperty boundProperty;
                bool propertyFound = propertyFinder.TryGetProperty(property.Name, out boundProperty);
                if (propertyFound)
                {
                    IValueConverter converter;
                    bool            converterExists = propertyFinder.TryGetConverter(boundProperty, out converter);
                    if (converterExists)
                    {
                        value = converter.Convert(value, null, null, null);
                    }
                    UIElement.SetValue(boundProperty, value);
                    BindProperty(model, UIElement, property.Name, boundProperty, converter);
                }
            }
            model.Control = UIElement;

            if (model is ViewGroup)
            {
                ViewGroup vg = model as ViewGroup;
                Panel     p  = UIElement as Panel;
                foreach (var child in vg.Children)
                {
                    p.Children.Add(ExtractAndBind(child));
                }
            }
            return(UIElement);
        }