Grouping: wrong runtime-type?

5 posts, 1 answers
  1. Steffen
    Steffen avatar
    77 posts
    Member since:
    Mar 2009

    Posted 31 Mar 2010 Link to this post

    Hi,
    can someone tell me how to make the following sample work (grouping by inner ID fails) without modifying the OuterElement-class (in real world that comes from a third-party)?
    The problem seems to be that the grouping does not use the right runtime-type but the type of the property(which is an interface that is inherited by SpecialInnerElement). Have a look and you see what I mean.

    xaml:
    <Window x:Class="RadGridGroupingType.Window1" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
        xmlns:telerikdata="clr-namespace:Telerik.Windows.Data;assembly=Telerik.Windows.Data" 
        xmlns:sys="clr-namespace:System;assembly=mscorlib" 
        Title="Window1" Height="300" Width="300"
        <Grid> 
            <telerik:RadGridView Name="radgv" AutoGenerateColumns="False" ItemsSource="{Binding}"
                <telerik:RadGridView.Columns> 
     
                    <telerik:GridViewDataColumn Header="outer ID" DataType="{x:Type sys:Int32}" GroupMemberPath="ID"
                        <telerik:GridViewColumn.CellTemplate> 
                            <DataTemplate> 
                                <TextBlock Text="{Binding Path=ID}"/> 
                            </DataTemplate> 
                        </telerik:GridViewColumn.CellTemplate> 
                    </telerik:GridViewDataColumn> 
     
                    <telerik:GridViewDataColumn Header="inner ID" DataType="{x:Type sys:Int32}" GroupMemberPath="InnerElement.ID"
                        <telerik:GridViewColumn.CellTemplate> 
                            <DataTemplate> 
                                <TextBlock Text="{Binding Path=InnerElement.ID}"/> 
                            </DataTemplate> 
                        </telerik:GridViewColumn.CellTemplate> 
                    </telerik:GridViewDataColumn> 
     
                </telerik:RadGridView.Columns> 
            </telerik:RadGridView> 
        </Grid> 
    </Window> 

    code-behind:
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Data; 
    using System.Windows.Documents; 
    using System.Windows.Input; 
    using System.Windows.Media; 
    using System.Windows.Media.Imaging; 
    using System.Windows.Navigation; 
    using System.Windows.Shapes; 
    using System.Collections.ObjectModel; 
     
    namespace RadGridGroupingType 
        /// <summary> 
        /// Interaction logic for Window1.xaml 
        /// </summary> 
        public partial class Window1 : Window 
        { 
            public Window1() 
            { 
                InitializeComponent(); 
     
                ObservableCollection<OuterElement> col = new ObservableCollection<OuterElement>(); 
     
                col.Add(new OuterElement() { ID = 1 }); 
                col.Add(new OuterElement() { ID = 2 }); 
                col.Add(new OuterElement() { ID = 3 }); 
     
                radgv.DataContext = col; 
            } 
        } 
     
        public class OuterElement 
        { 
            public int ID { getset; } 
     
            private SpecialInnerElement m_innerElement = new SpecialInnerElement() { ID = 99 }; 
     
            //public SpecialInnerElement InnerElement //returning the right runtimeType: grouping works 
            public IInnerElement InnerElement         //returning interface: grouping does not work 
            { 
                get { return m_innerElement; } 
            } 
        } 
     
        public interface IInnerElement 
        { 
            //"does not matter"; 
        } 
     
        public class SpecialInnerElement: IInnerElement 
        { 
            public int ID { getset; } 
        } 

    Best Regards
    Steffen
  2. Rossen Hristov
    Admin
    Rossen Hristov avatar
    2478 posts

    Posted 02 Apr 2010 Link to this post

    Hello Steffen,

    The interface should have this property if you want to be able to group. Our data engine is working directly with your interface. Since it does not have this property the expressions that we are building will fail.

    Your interface should look like this in case you want to group by its property:

        public interface IInnerElement

        {

            int ID { get; set; }

        }



    You might be wandering: Then why do I see values in the second column? This is because cells display their values via a Binding which is not very picky about types.

    Let me know if you have any questions.

    Best wishes,
    Ross
    the Telerik team

    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items.
  3. UI for WPF is Visual Studio 2017 Ready
  4. Steffen
    Steffen avatar
    77 posts
    Member since:
    Mar 2009

    Posted 06 Apr 2010 Link to this post

    Hi,
    thank you for the response. That is pretty much what I was guessing.
    The problem is that I can not change the interface. Is there a way to build the grouping expression manually in the grouping-event (based on the column's unique name)? Or maybe this can be somehow achieved by using a ValueConverter?
    Actually the outerElemnt is the RadScheduler's Occuence, the interface is IAppointment and the innerElement is my own MyAppointment-type. So how could I bind a collection of Occurences to a GridView which also shows properties of MyAppointment  (returned by Occurences.Appointment as IAppointment) and still be able to group?


    Best
    Regards
    Steffen
  5. Answer
    Rossen Hristov
    Admin
    Rossen Hristov avatar
    2478 posts

    Posted 06 Apr 2010 Link to this post

    Hi Steffen,

    In case you cannot change the interface, you will have to build wrappers around your classes. The wrappers will expose the correct properties. Then bind the grid to this intermediate wrapper layer. I cannot think of an easier way to solve this issue.

    Regards,
    Ross
    the Telerik team

    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items.
  6. Steffen
    Steffen avatar
    77 posts
    Member since:
    Mar 2009

    Posted 06 Apr 2010 Link to this post

    Hi,
    I'll try that.

    Best Regards
    Steffen
Back to Top
UI for WPF is Visual Studio 2017 Ready