application not working after update to q3

11 posts, 0 answers
  1. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 02 Mar 2010 Link to this post

    Hi,
    I have a simple app very similar to the carousel demo (First look), the app was working fine with 2009 Q2, but  after upgrade to 2009 Q3, the app throws the following error:

    System.Reflection.TargetInvocationException was unhandled
      Message="Exception has been thrown by the target of an invocation."
      Source="mscorlib"
      StackTrace:
           at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
           at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
           at System.Delegate.DynamicInvokeImpl(Object[] args)
           at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
           at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
           at System.Windows.Threading.DispatcherOperation.InvokeImpl()
           at System.Threading.ExecutionContext.runTryCode(Object userData)
           at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Windows.Threading.DispatcherOperation.Invoke()
           at System.Windows.Threading.Dispatcher.ProcessQueue()
           at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
           at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
           at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
           at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
           at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
           at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
           at System.Windows.Threading.Dispatcher.TranslateAndDispatchMessage(MSG& msg)
           at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
           at System.Windows.Application.RunInternal(Window window)
           at CuiraWPF.App.Main() in D:\projects2\own\XMPP messenger\client\Cuira\CuiraWPF\obj\Debug\App.g.cs:line 0
           at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ThreadHelper.ThreadStart()
      InnerException: System.InvalidOperationException
           Message="Added item does not appear at given index '3'."
           Source="PresentationFramework"
           StackTrace:
                at System.Windows.Data.ListCollectionView.AdjustBefore(NotifyCollectionChangedAction action, Object item, Int32 index)
                at System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args)
                at Telerik.Windows.Data.DataItemCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs e) in c:\Builds\WPF_Scrum\Release_WPF\Sources\Development\Core\Data\Collections\DataItemCollection.cs:line 506
                at Telerik.Windows.Data.DataItemCollection.Telerik.Windows.Data.IWeakEventListener<System.Collections.Specialized.NotifyCollectionChangedEventArgs>.ReceiveWeakEvent(Object sender, NotifyCollectionChangedEventArgs e) in c:\Builds\WPF_Scrum\Release_WPF\Sources\Development\Core\Data\Collections\DataItemCollection.cs:line 725
                at Telerik.Windows.Data.WeakEvent.WeakListener`1.Handler(Object sender, TArgs args) in c:\Builds\WPF_Scrum\Release_WPF\Sources\Development\Core\Data\WeakEvents\WeakEvent.cs:line 32
                at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
                at Telerik.Windows.Data.QueryableCollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) in c:\Builds\WPF_Scrum\Release_WPF\Sources\Development\Core\Data\Collections\QueryableCollectionView.cs:line 482
                at Telerik.Windows.Data.QueryableCollectionView.RefreshAndRaiseCollectionChanged(NotifyCollectionChangedEventArgs args) in c:\Builds\WPF_Scrum\Release_WPF\Sources\Development\Core\Data\Collections\QueryableCollectionView.cs:line 557
                at Telerik.Windows.Data.QueryableCollectionView.OnSourceCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) in c:\Builds\WPF_Scrum\Release_WPF\Sources\Development\Core\Data\Collections\QueryableCollectionView.cs:line 640
                at Telerik.Windows.Data.QueryableCollectionView.Telerik.Windows.Data.IWeakEventListener<System.Collections.Specialized.NotifyCollectionChangedEventArgs>.ReceiveWeakEvent(Object sender, NotifyCollectionChangedEventArgs args) in c:\Builds\WPF_Scrum\Release_WPF\Sources\Development\Core\Data\Collections\QueryableCollectionView.cs:line 631
                at Telerik.Windows.Data.WeakEvent.WeakListener`1.Handler(Object sender, TArgs args) in c:\Builds\WPF_Scrum\Release_WPF\Sources\Development\Core\Data\WeakEvents\WeakEvent.cs:line 32
                at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
                at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
                at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedAction action, Object item, Int32 index)
                at System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item)
                at System.Collections.ObjectModel.Collection`1.Add(T item)
                at CuiraWPF.Code.MessengerHelper.<>c__DisplayClass17.<Connection_OnRosterItem>b__13() in D:\projects2\own\XMPP messenger\client\Cuira\CuiraWPF\Code\MessengerHelper.cs:line 305
           InnerException: 

    The code line 305 is just a : ContactList.Add(current);

    Any clues?

    Additional information:
    I found a temp fix:
    I have an event handler that is listening when the collection changes, every time the observable collection is changed, it is reordered, I created a class that inherits from ObservableCollection, I have used that class on Silverlight with your components and it works fine, as I mentioned, the code works fine with Q2 and WPF, my temp solution was to comment the sort code and its working now, not the way that I need, but at least is displaying data.

  2. Milan
    Admin
    Milan avatar
    1989 posts

    Posted 08 Mar 2010 Link to this post

    Hello Pedro,

    We couldn't reproduce the problem. May I ask you to send us a sample project that will allow us to reproduce the exception.

    Thank you for your time.


    Regards,
    Milan
    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. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 08 Mar 2010 Link to this post

    Sure, how can I send to you the sample project since I cannot open a support ticked with this account?

    Edited:
    I decided to post all the files as comments, you can recreate the sample project with them.
  5. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 08 Mar 2010 Link to this post

    <Window x:Class="carrouselSample.Window1" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:carousel="clr-namespace:Telerik.Windows.Controls.Carousel;assembly=Telerik.Windows.Controls.Navigation" 
        Title="Window1" Height="350" Width="535"   
            xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">  
        <Grid> 
            <Grid.Resources> 
                <carousel:ArithmeticValueConverter x:Key="ArithmeticValueConverter" /> 
     
                <Style TargetType="{x:Type telerik:CarouselItem}">  
                    <Setter Property="Template">  
                        <Setter.Value> 
                            <ControlTemplate TargetType="{x:Type telerik:CarouselItem}">  
                                <Grid ClipToBounds="False" Height="150" Width="200">  
                                    <Border RenderTransformOrigin="0.5, 1" ClipToBounds="False" 
                                            Width="{Binding ElementName=CarouselItemInnerGrid, Path=ActualWidth}" 
                                            Opacity="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ReflectionSettings.Opacity}" 
                                            Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ReflectionSettings.Visibility}" 
                                            BorderBrush="White" BorderThickness="0">  
                                        <Border.RenderTransform> 
                                            <TransformGroup> 
                                                <ScaleTransform ScaleX="{Binding RelativeSource={RelativeSource TemplatedParent},   
                                                            Path=ReflectionSettings.WidthOffset,   
                                                            Converter={StaticResource ArithmeticValueConverter},   
                                                            ConverterParameter=1}" ScaleY="{Binding RelativeSource={RelativeSource TemplatedParent},   
                                                            Path=ReflectionSettings.HeightOffset,   
                                                            Converter={StaticResource ArithmeticValueConverter},   
                                                            ConverterParameter=-1}"  
                                                        CenterY="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ReflectionSettings.OffsetY}" /> 
                                                <TranslateTransform  
                                                        X="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ReflectionSettings.OffsetX}" /> 
                                                <SkewTransform  
                                                        AngleX="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ReflectionSettings.Angle}" /> 
                                            </TransformGroup> 
     
                                        </Border.RenderTransform> 
                                        <Border.OpacityMask> 
                                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">  
                                                <LinearGradientBrush.GradientStops> 
                                                    <GradientStop  
                                                            Offset="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ReflectionSettings.HiddenPercentage}" 
                                                            Color="Transparent" /> 
                                                    <GradientStop Offset="1" Color="Black" /> 
                                                </LinearGradientBrush.GradientStops> 
                                            </LinearGradientBrush> 
                                        </Border.OpacityMask> 
                                        <Border.Background> 
                                            <VisualBrush  
                                                    Visual="{Binding ElementName=CarouselItemInnerGrid}">  
                                            </VisualBrush> 
                                        </Border.Background> 
     
                                    </Border> 
     
                                    <Grid x:Name="CarouselItemInnerGrid">  
                                        <Border x:Name="CarouselItemMainBorder" Opacity="0.5" 
                                                BorderBrush="#FF91B3FF" BorderThickness="1,1,1,1" 
                                                CornerRadius="5,5,5,5" SnapsToDevicePixels="True">  
                                            <Border.Background> 
                                                <LinearGradientBrush EndPoint="108,472" 
                                                        StartPoint="108,23" MappingMode="Absolute">  
                                                    <GradientStop Color="#FF2C3A68" Offset="0" /> 
                                                    <GradientStop Color="#FF000000" Offset="1" /> 
                                                    <GradientStop Color="#FF0F224C" Offset="0.045" /> 
                                                    <GradientStop Color="#FF000000" Offset="0.0451" /> 
                                                </LinearGradientBrush> 
                                            </Border.Background> 
                                        </Border> 
                                        <Border Opacity="1" BorderBrush="#3F000000" 
                                                BorderThickness="1,1,1,1" CornerRadius="5,5,5,5" 
                                                Margin="10,10,10,10" x:Name="CarouselItemInnerBorder" 
                                                SnapsToDevicePixels="True">  
                                            <Border.Background> 
                                                <LinearGradientBrush EndPoint="101,462" 
                                                        StartPoint="101,13" MappingMode="Absolute">  
                                                    <GradientStop Color="#FF2C3A68" Offset="0" /> 
                                                    <GradientStop Color="#FF000000" Offset="1" /> 
                                                    <GradientStop Color="#FF0F224C" Offset="0.045" /> 
                                                    <GradientStop Color="#FF000000" Offset="0.0451" /> 
                                                </LinearGradientBrush> 
                                            </Border.Background> 
                                            <ContentPresenter IsHitTestVisible="True" /> 
                                            <Border.Triggers> 
     
                                            </Border.Triggers> 
                                        </Border> 
                                    </Grid> 
                                </Grid> 
     
                                <ControlTemplate.Triggers> 
                                    <MultiTrigger> 
                                        <MultiTrigger.Conditions> 
                                            <Condition Property="IsSelected" Value="False" /> 
                                            <Condition Property="IsMouseOver" Value="True" /> 
                                        </MultiTrigger.Conditions> 
                                        <MultiTrigger.EnterActions> 
                                            <BeginStoryboard> 
                                                <Storyboard> 
                                                    <ColorAnimation  
                                                            Storyboard.TargetName="CarouselItemMainBorder" 
                                                            Storyboard.TargetProperty="Background.GradientStops[0].Color" 
                                                            To="#FF344B97" Duration="0:0:0.3" /> 
                                                    <ColorAnimation  
                                                            Storyboard.TargetName="CarouselItemMainBorder" 
                                                            Storyboard.TargetProperty="Background.GradientStops[2].Color" 
                                                            To="#FF233F7E" Duration="0:0:0.3" /> 
                                                    <ColorAnimation  
                                                            Storyboard.TargetName="CarouselItemInnerBorder" 
                                                            Storyboard.TargetProperty="Background.GradientStops[0].Color" 
                                                            To="#FF344B97" Duration="0:0:0.3" /> 
                                                    <ColorAnimation  
                                                            Storyboard.TargetName="CarouselItemInnerBorder" 
                                                            Storyboard.TargetProperty="Background.GradientStops[2].Color" 
                                                            To="#FF233F7E" Duration="0:0:0.3" /> 
                                                </Storyboard> 
                                            </BeginStoryboard> 
     
                                        </MultiTrigger.EnterActions> 
                                        <MultiTrigger.ExitActions> 
                                            <BeginStoryboard> 
                                                <Storyboard FillBehavior="Stop">  
                                                    <ColorAnimation  
                                                            Storyboard.TargetName="CarouselItemMainBorder" 
                                                            Storyboard.TargetProperty="Background.GradientStops[0].Color" 
                                                            To="#FF2C3A68" Duration="0:0:0.3" /> 
                                                    <ColorAnimation  
                                                            Storyboard.TargetName="CarouselItemMainBorder" 
                                                            Storyboard.TargetProperty="Background.GradientStops[2].Color" 
                                                            To="#FF0F224C" Duration="0:0:0.3" /> 
                                                    <ColorAnimation  
                                                            Storyboard.TargetName="CarouselItemInnerBorder" 
                                                            Storyboard.TargetProperty="Background.GradientStops[0].Color" 
                                                            To="#FF2C3A68" Duration="0:0:0.3" /> 
                                                    <ColorAnimation  
                                                            Storyboard.TargetName="CarouselItemInnerBorder" 
                                                            Storyboard.TargetProperty="Background.GradientStops[2].Color" 
                                                            To="#FF0F224C" Duration="0:0:0.3" /> 
                                                </Storyboard> 
                                            </BeginStoryboard> 
                                        </MultiTrigger.ExitActions> 
                                    </MultiTrigger> 
     
                                    <Trigger Property="IsSelected" Value="True">  
                                        <Setter TargetName="CarouselItemMainBorder" 
                                                Property="Background">  
                                            <Setter.Value> 
                                                <LinearGradientBrush EndPoint="108,472" 
                                                        StartPoint="108,23" MappingMode="Absolute">  
                                                    <GradientStop Color="#FF344B97" Offset="0" /> 
                                                    <GradientStop Color="#FF000000" Offset="1" /> 
                                                    <GradientStop Color="#FF233F7E" Offset="0.045" /> 
                                                    <GradientStop Color="#FF000000" Offset="0.0451" /> 
                                                </LinearGradientBrush> 
                                            </Setter.Value> 
                                        </Setter> 
                                        <Setter TargetName="CarouselItemInnerBorder" 
                                                Property="Background">  
                                            <Setter.Value> 
                                                <LinearGradientBrush EndPoint="101,462" 
                                                        StartPoint="101,13" MappingMode="Absolute">  
                                                    <GradientStop Color="#FF344B97" Offset="0" /> 
                                                    <GradientStop Color="#FF000000" Offset="1" /> 
                                                    <GradientStop Color="#FF233F7E" Offset="0.045" /> 
                                                    <GradientStop Color="#FF000000" Offset="0.0451" /> 
                                                </LinearGradientBrush> 
                                            </Setter.Value> 
                                        </Setter> 
                                    </Trigger> 
     
                                </ControlTemplate.Triggers> 
                            </ControlTemplate> 
                        </Setter.Value> 
                    </Setter> 
                </Style> 
     
                <Style TargetType="{x:Type telerik:CarouselDataRecordPresenter}">  
                    <Setter Property="Template">  
                        <Setter.Value> 
                            <ControlTemplate TargetType="{x:Type telerik:CarouselDataRecordPresenter}">  
                                <Grid IsHitTestVisible="False" HorizontalAlignment="Stretch" 
                                             
                                        
                                        VerticalAlignment="Stretch">  
                                    <Grid.Background> 
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">  
                                            <GradientStop Color="White" Offset="0"/>  
                                            <GradientStop Color="Silver" Offset="1"/>  
                                            <GradientStop Color="WhiteSmoke" Offset="0.43"/>  
                                            <GradientStop Color="WhiteSmoke" Offset="0.42"/>  
                                        </LinearGradientBrush> 
                                    </Grid.Background> 
                                    <Grid.RowDefinitions> 
                                        <RowDefinition Height="Auto" /> 
                                        <RowDefinition Height="Auto" /> 
                                    </Grid.RowDefinitions> 
                                    <StackPanel Grid.Row="0" Orientation="Vertical" Margin="5,5,0,0" 
                                            VerticalAlignment="Top">  
     
                                        <TextBlock  Text="{Binding Path=FullName}"  Height="Auto"   
                                                Foreground="Black"  FontSize="12" /> 
                                        <TextBlock Text="{Binding Path=FirstName}" Height="Auto"   
                                                Foreground="DarkBlue" FontSize="10" /> 
                                        <TextBlock Text="{Binding Path=LastName}" Height="Auto"   
                                                       TextTrimming="WordEllipsis" 
                                                Foreground="DarkGreen" FontSize="10" /> 
                                    </StackPanel> 
                                      
                                </Grid> 
                            </ControlTemplate> 
                        </Setter.Value> 
                    </Setter> 
                </Style> 
     
            </Grid.Resources> 
              
              
            <telerik:RadCarousel Margin="10,10,0,41" Name="radCarousel1" 
                                 ItemsSource="{Binding UserList}">  
                  
            </telerik:RadCarousel> 
        </Grid> 
    </Window> 
     
  6. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 08 Mar 2010 Link to this post

    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 carrouselSample.Code;  
     
    namespace carrouselSample  
    {  
          
          
     
     
        /// <summary>  
        /// Interaction logic for Window1.xaml  
        /// </summary>  
        public partial class Window1 : Window  
        {  
            //this is just for demonstrating purposes  
            WindowVM _VM;  
     
            public Window1()  
            {  
                InitializeComponent();  
                Loaded += new RoutedEventHandler(Window1_Loaded);  
                //this is just for demonstrating purposes  
                _VM = new WindowVM();  
            }  
     
            void Window1_Loaded(object sender, RoutedEventArgs e)  
            {  
                //this is just for demonstrating purposes  
                this.DataContext = _VM;  
            }  
        }  
    }  
     
  7. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 08 Mar 2010 Link to this post

    using System;  
    using System.ComponentModel;  
    using System.Windows.Threading;  
     
    namespace carrouselSample.Code  
    {  
        public class WindowVM: INotifyPropertyChanged  
        {  
     
            DispatcherTimer _AddUsersDispatcher;  
     
            /// <summary>  
            /// Add users async to simulate real world situation  
            /// </summary>  
            public WindowVM()  
            {  
                _AddUsersDispatcher = new DispatcherTimer();  
                _AddUsersDispatcher.Interval = new TimeSpan(0, 0, 0, 0, 300);  
                _AddUsersDispatcher.Tick += new EventHandler(_AddUsersDispatcher_Tick);  
                _AddUsersDispatcher.Start();  
                _UserList.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_UserList_CollectionChanged);  
     
            }  
     
              
     
     
            /// <summary>  
            /// Add users  
            /// </summary>  
            void _AddUsersDispatcher_Tick(object sender, EventArgs e)  
            {  
     
                if (_UserList.Count < 30)  
                {  
                    User u = new User() { FirstName = string.Format("John{0}", _UserList.Count), LastName = string.Format("{0}Smith", _UserList.Count), Other = DateTime.Now.ToString() };  
                    _UserList.Add(u);  
                }  
                else   
                {  
                    //stop the timer  
                    _AddUsersDispatcher.Stop();  
                }  
                 
            }  
     
     
     
            /// <summary>  
            /// The user list  
            /// </summary>  
            private ObservableSortableCollection<User> _UserList = new ObservableSortableCollection<User>();  
            public ObservableSortableCollection<User> UserList  
            {  
                get   
                {  
                    return _UserList;  
                }  
     
            }  
     
     
            void _UserList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)  
            {  
                UserList.SortBy(c => c.FullName, ListSortDirection.Descending);  
            }
            #region INotifyPropertyChanged Members  
     
            public event PropertyChangedEventHandler PropertyChanged;  
            public void OnPropertyChanged(string property)  
            {  
                if (PropertyChanged != null)  
                {  
                    PropertyChanged(thisnew PropertyChangedEventArgs(property));  
                }  
            }
            #endregion  
        }  
    }  
     
  8. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 08 Mar 2010 Link to this post

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
     
    namespace carrouselSample.Code  
    {  
        public class User  
        {  
     
            public string FirstName  
            {  
                get;  
                set;  
            }  
            public string LastName  
            {  
                get;  
                set;  
            }  
     
            public string Other  
            {  
                get;  
                set;  
            }  
     
            public string FullName  
            {  
                get 
                {  
                    return string.Format("{0}, {1}",LastName,FirstName);  
                }  
            }  
        }  
    }  
     
  9. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 08 Mar 2010 Link to this post

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Collections.ObjectModel;  
     
    namespace carrouselSample.Code  
    {  
     
        // Summary:  
        //     Specifies the direction of a sort operation.  
        public enum ListSortDirection  
        {  
            Ascending = 0,  
            Descending = 1,  
        }  
     
        /// <summary>  
        /// Allows to create an observable + sortable collection  
        /// </summary>  
        /// <typeparam name="T">Type of colection</typeparam>  
        public class ObservableSortableCollection<T> : ObservableCollection<T>  
        {  
     
     
            List<T> _OriginalList;  
     
            /// <summary>  
            /// constructor  
            /// </summary>  
            public ObservableSortableCollection()  
                : base()  
            {  
     
            }  
     
     
            /// <summary>  
            /// Sort the observable collection  
            /// </summary>  
            /// <param name="keySelector">function used to sort</param>  
            /// <param name="direction">sort  direction</param>  
            public void SortBy<TKey>(Func<T, TKey> keySelector, ListSortDirection direction)  
            {  
                switch (direction)  
                {  
                    case ListSortDirection.Ascending:  
                        SortCollection(Items.OrderBy(keySelector).ToList());  
                        break;  
                    default:  
                        SortCollection(Items.OrderByDescending(keySelector).ToList());  
                        break;  
     
                }  
            }  
     
     
            /// <summary>  
            /// Sorts the collection  
            /// </summary>  
            /// <param name="sortedItems">sorted list</param>  
            private void SortCollection(IList<T> sortedItems)  
            {  
                //first clear the list, then add the items ordered  
                Items.Clear();  
                foreach (var item in sortedItems)  
                {  
                    Items.Add(item);  
                }  
            }  
     
     
     
        }  
    }  
     
  10. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 08 Mar 2010 Link to this post

    You will be able to recreate the sample project with those posts, as I mentioned, that code works fine with q2 with minor changes to the carouselItem template.
  11. Milan
    Admin
    Milan avatar
    1989 posts

    Posted 10 Mar 2010 Link to this post

    Hi Pedro,

    Thank you for sharing your code. 

    It turned out that the exception is caused by an incorrect behavior of the ObservableSortableCollection and WindowVM. Whever the UserList is changed it raises a CollectionChanged event which notifies all listeners like RadCarousel. Unfortunately before this event reaches RadCarousel the items of the ObservableSortableCollection are already sorted (with changed places) and as a result RadCarousel receives CollectionChanged event with wrong indices.

    Probably the best approach is to use a ListCollectionView which has built-in sorting functionality. Moreover by using ListCollectionView you will not have to implement custom collections. The switch to ListCollectionView requires just a few changes.:

    public class WindowVM : INotifyPropertyChanged
    {
        DispatcherTimer _AddUsersDispatcher;
        ObservableCollection<User> data = new ObservableCollection<User>();
      
        /// <summary>  
        /// The user list  
        /// </summary>  
        private ListCollectionView _UserList;
        public ListCollectionView UserList
        {
            get
            {
                return _UserList;
            }
            private set
            {
                this._UserList = value;
            }
        }
      
        /// <summary>  
        /// Add users async to simulate real world situation  
        /// </summary>  
        public WindowVM()
        {
            // create sorted ListCollectionView with empty data
            this.UserList = new ListCollectionView(this.data);
            this.UserList.SortDescriptions.Add(new SortDescription("FullName", System.ComponentModel.ListSortDirection.Descending));
      
            _AddUsersDispatcher = new DispatcherTimer();
            _AddUsersDispatcher.Interval = new TimeSpan(0, 0, 0, 0, 300);
            _AddUsersDispatcher.Tick += new EventHandler(_AddUsersDispatcher_Tick);
            _AddUsersDispatcher.Start();
      
        }
      
        /// <summary>  
        /// Add users  
        /// </summary>  
        void _AddUsersDispatcher_Tick(object sender, EventArgs e)
        {
      
            if (this.data.Count < 30)
            {
                User u = new User() { FirstName = string.Format("John{0}", _UserList.Count), LastName = string.Format("{0}Smith", _Us
                this.data.Add(u);
            }
            else
            {
                //stop the timer  
                _AddUsersDispatcher.Stop();
            }
      
        }

    Hope this helps.


    All the best,
    Milan
    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.
  12. Pedro
    Pedro avatar
    22 posts
    Member since:
    Apr 2008

    Posted 10 Mar 2010 Link to this post

    Thanks a lot, the old version of the carousel control was hiding my wrong approach of the problem.
Back to Top
UI for WPF is Visual Studio 2017 Ready