Caching ICustomTypeProvider

10 posts, 0 answers
  1. Franz
    Franz avatar
    4 posts
    Member since:
    Mar 2013

    Posted 15 Jul 2013 Link to this post

    Hi,

    I implement an application, where some objects, which exist on server, are edited remotely in a Silverlight application.

    For editing of properties of an object I use the RadPropertyGrid control. Because there is no actual type of the edited object in the Silverlight app, I implemented a class, which implement the ICustomTypeProvider interface, and which returns all necessary metadata.

    Everything works fine until I need to edit an object of another type. The RadPropertyGrid always shows property of the first type.

    I analyzed your code, and found the following:

    internal static IEnumerable<ItemPropertyInfo> RetrieveItemPropertiesFromPropertyDescriptors(object item)

    {

           if (item != null && ShouldCacheProertyDescriptorsForType(item.GetType()) && ItemPropertiesCache.ContainsKey(item.GetType().AssemblyQualifiedName))

           {

                return ItemPropertiesCache[item.GetType().AssemblyQualifiedName];

           }

           if (ItemPropertiesCache.ContainsKey(item.GetType().AssemblyQualifiedName))

           {

                return ItemPropertiesCache[item.GetType().AssemblyQualifiedName];

           }

           else

           {

                var result = CreateItemPropertyInfoFromDescriptor(GetPropertyDescriptors(item));

                if (item != null && ShouldCacheProertyDescriptorsForType(item.GetType()))

                {

                     ItemPropertiesCache.Add(item.GetType().AssemblyQualifiedName, result);

                }

                return result;

           }

    }

    First of all, in the code the to ifs check actually the same. If the first one is false because the item implements IDynamicMetaObjectProvider, anyway the second if is always true.

    So, because I have only one class, which implement the ICustomTypeProvider interface, the first set of properties is always cached.

    What can I do in this situation? Could you please fix it in you next version?

    Sorry, it was a question about PropertyGrid.

     

     

     

     

  2. Maya
    Admin
    Maya avatar
    4062 posts

    Posted 17 Jul 2013 Link to this post

    Hello Franz,

    I have tried to reproduce the behavior, but still without much success. Based on the example from this blog post, I prepared a project with RadPropertyGrid that has its Item changed. Could you take a look at it and let me know whether I am missing something ? Can you reproduce the same behavior on it ?  

    Regards,
    Maya
    Telerik
    TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for SILVERLIGHT.
    Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
    Sign up for Free application insights >>
  3. DevCraft banner
  4. Franz
    Franz avatar
    4 posts
    Member since:
    Mar 2013

    Posted 17 Jul 2013 Link to this post

    Hello,

    Thanks you so much for fast response.

    The problem with the sample from the blog post is, that the dynamic types are not 100% dynamic. The Customer and Product classes are defined in the project, and to these classes some additional properties are added.

    I need completely dynamic classes. So that the CustomTypeHelper class cannot be generic. There is no classes, with which I can use it.

    I modified the sample, so that it creates completely dynamic classes. As you see, if you press first Customer button, than you see properties of it. Everything ok. Now press Product. Still properties of Customer are displayed (with no values).

    The problem is with RadPropertyGrid caching properties of a type. But I have only one type: CustomTypeHelper.

    Even the sample from the blog would no work with the RadPropertyGrid, if it is needed to some later time point add some additional properties. For example to CustomTypeHelper<Customer> instance.

    Here you can get my sample:

    http://dl.membrain-it.com/telerik/
  5. Maya
    Admin
    Maya avatar
    4062 posts

    Posted 22 Jul 2013 Link to this post

    Hi Franz,

    Indeed, you are right - in this case properties for the second scenario are not created. The thing is that there is no unified method by which we can understand what the implementation of the interface is and how properties are added/ removed. And consequently, there might be a lot of different approaches which we cannot anticipate. That is why we cannot improve the behavior so that out-of-the-box the newly added properties are created. You can observe the same behavior with Microsoft controls as well - for example DataGrid will not generate column for the new properties.
    What I can suggest is either to follow the approach from the sample I previously attached or generate PropertyDefinition-s on your own. 

    Regards,
    Maya
    Telerik
    TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for SILVERLIGHT.
    Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
    Sign up for Free application insights >>
  6. Franz
    Franz avatar
    4 posts
    Member since:
    Mar 2013

    Posted 22 Jul 2013 Link to this post

    Hi Maya,

    > or generate PropertyDefinition-s on your own. 

    I'm not quite sure what you mean by this. If you mean custom PropertyInfo, then this is already done in both original, as well modified samples.

    I see in your code, that you skip caching of Properties of type implementing IDynamicMetaObjectProvider interface:

    private static bool ShouldCacheProertyDescriptorsForType(Type type)

    {

    #if WPF40

    return !type.IsCompatibleWith(typeof(ICustomTypeDescriptor)) && !type.IsCompatibleWith(typeof(IDynamicMetaObjectProvider));

    #elif SILVERLIGHT

    return !type.IsCompatibleWith(typeof(IDynamicMetaObjectProvider));

    #endif

    }

    My suggestion is to add also ICustomTypeProvider for Silveright:

    private static bool ShouldCacheProertyDescriptorsForType(Type type)

    {

    #if WPF40

    return !type.IsCompatibleWith(typeof(ICustomTypeDescriptor)) && !type.IsCompatibleWith(typeof(IDynamicMetaObjectProvider));

    #elif SILVERLIGHT

    return !type.IsCompatibleWith(typeof(IDynamicMetaObjectProvider)) && !type.IsCompatibleWith(typeof(ICustomTypeProvider));

    #endif

    }

    Regards.

     

     

     

     

     

     

  7. Maya
    Admin
    Maya avatar
    4062 posts

    Posted 22 Jul 2013 Link to this post

    Hello Franz,

    My suggestion was to create PropertyDefinition of the property grid:

    var propertyDefinition = new PropertyDefinition() {Binding = new Binding("MyProperty")};
    this.myPropertyGrid.PropertyDefinitions.Add(propertyDefinition);
     

    Regards,
    Maya
    Telerik
    TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for SILVERLIGHT.
    Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
    Sign up for Free application insights >>
  8. ITA
    ITA avatar
    383 posts
    Member since:
    Aug 2009

    Posted 05 Feb 2014 in reply to Maya Link to this post

    Hi,

    do you have the attached example also for wpf?

    Thanks
    Rene
  9. Maya
    Admin
    Maya avatar
    4062 posts

    Posted 07 Feb 2014 Link to this post

    Hello Rene,

    Will it be possible to clarify what kind of example you need ? What functionality do you require for it to demonstrate ? 

    Regards,
    Maya
    Telerik

    Check out the new Telerik Platform - the only modular platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native apps. Register for the free online keynote and webinar to learn more about the Platform on Wednesday, February 12, 2014 at 11:00 a.m. ET (8:00 a.m. PT).

  10. ITA
    ITA avatar
    383 posts
    Member since:
    Aug 2009

    Posted 07 Feb 2014 in reply to Maya Link to this post

    Hi,

    the problem ist, that i have to create Properties on runtime and bind the object to a GridView. I create a Full text search
    for our business-software and out of this software i get different databases and tables with different columns and i want
    to use one object!

     I found solutins for Silverlight ICustomTypeProvider, but i need an example for wpf (standalone pur wpf no silverlight at all).

    Thanks
    Best Regardes
  11. Maya
    Admin
    Maya avatar
    4062 posts

    Posted 12 Feb 2014 Link to this post

    Hello Rene,

    Once you implement ICustomTypeProvider - it should be similar to the one in this blog post, you can set the Item to the property grid as follows:
    public MainWindow()
            {
                InitializeComponent();
     
                Customer.AddProperty("Name", typeof(string));
     
                Customer customer1 = new Customer();
                customer1.SetPropertyValue("Name", "Chris");       
     
                this.customerPropertyGrid.Item = customer1;        
            }

    Please keep in mind that ICustomTypeProvider is available only in .Net 4.5



    Regards,
    Maya
    Telerik

    Check out the new Telerik Platform - the only modular platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native apps. Register for the free online keynote and webinar to learn more about the Platform on Wednesday, February 12, 2014 at 11:00 a.m. ET (8:00 a.m. PT).

Back to Top
DevCraft banner