This is a migrated thread and some comments may be shown as answers.

Bug in Background color of appointment?

6 Answers 152 Views
ScheduleView
This is a migrated thread and some comments may be shown as answers.
Francisco Bernardo
Top achievements
Rank 1
Francisco Bernardo asked on 24 May 2012, 11:40 AM
Hello,

I'm using ScheduleView in this scenario where I've extended the Appointment Class with my own custom class (ActivityWrapper 
). My class stores a brush as a property in order to establish a binding to the AppointmentItemBaseStyle Background property, and that way, to present the Appointments in the Schedule view with a controlled color range.

The style

        <Style x:Key="AppointmentItemBaseStyle" TargetType="telerik_GeneralScheduleView:AppointmentItem">
            <Setter Property="Background" Value="{Binding Converter={StaticResource AppointmentToActivityWrapperColor}}" />
            <Setter Property="BorderBrush" Value="{StaticResource RadScheduleForeground}" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="VerticalContentAlignment" Value="Stretch" />
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="Padding" Value="2 0 0 0" />
            <Setter Property="ContentTemplate" Value="{StaticResource AppointmentItemTemplate}" />
            <Setter Property="Template" Value="{StaticResource AppointmentItemHorizontalControlTemplate}" />
            <Setter Property="Canvas.ZIndex" Value="1" />
        </Style>

The converter


public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     {
         try
         {
             AppointmentItemProxy aip = value as AppointmentItemProxy;
             if (aip != null)
             {
                 ActivityWrapper aw = ((ActivityWrapper)aip.Appointment);
                 if(aw.IsEnabled)
                     return aw.Color;
                 else
                     return new SolidColorBrush(Colors.LightGray);
             }
             else
                 return new SolidColorBrush(Colors.LightGray);
         }
         catch (Exception ex)
         {
             LoggingManager.Error("Module.ActivitySet.Silverlight", "AptmColorToBackgroundConverter", "Convert", "General failure", ex);
             return null;
         }
     }
However, when I scroll in the schedule view, or edit some appointment, the colors of the Apppointments interchange erroneously- I believe there is some bug in the control, because the bounded objects keep their state. Can you acknowledge and provide any solution? Thank you, Francisco

6 Answers, 1 is accepted

Sort by
0
Dani
Telerik team
answered on 28 May 2012, 02:49 PM
Hello Francisco,

This behavior results from the fact that the DataContext does not get updated. This is intended and is done for performance optimization.
 Your Converter is called only once. And so the appointments do not maintain the correct background color.

The right thing to do is bind directly to your Brush property. If you have a Brush property in your custom appointment, you are able to bind directly to it without the need for a Converter. Please, check the following:
<Style x:Key="AppointmentItemBaseStyle" TargetType="telerik:AppointmentItem">
            <Setter Property="Background" Value="{Binding Appointment.MyColor}" />
</Style>

I think the result from the above is the behavior you are looking for.

I hope this helps.

Regards,
Dani
the Telerik team
Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>
0
Francisco Bernardo
Top achievements
Rank 1
answered on 29 May 2012, 05:07 PM
Hello Dani,

thank you for replying. I have tried that solution already, but I didn't go forward with as I noticed that a NullExcepction appeared and crashed the application. I believe this happens because the appointment in Binding Appointment.MyColor comes up null, whenever you start messing with the scrollbar.

Any alternative?

Regards,
Francisco 
 
0
Dani
Telerik team
answered on 01 Jun 2012, 01:54 PM
Hi Francisco,

It is strange that you get a NullException... You can still try using your Converter as long as you set the Binding through the AppointmentItemProxy.Appointment property as this is what gets updated, and not the DataContext.

I hope this will work fine in your scenario.

Regards,
Dani
the Telerik team
Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>
0
Michael MSTG
Top achievements
Rank 1
answered on 30 Jan 2013, 07:20 PM
I too have a schedule view instance that seemingly does not always apply a background color to the template.

My XAML:
<DataTemplate x:Key="AppointmentTemplate">
        <Grid Background="{Binding Path=Appointment.Background}">
            <TextBlock Text="{Binding Subject}"
                       TextWrapping="Wrap"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Top"
                       FontSize="11"
                       Foreground="{Binding Path=Appointment.TextForeground}" />
        </Grid>
    </DataTemplate>
 ...
<telerik:RadScheduleView x:Name="svBusSchedule"
AppointmentItemContentTemplate="{StaticResource AppointmentTemplate}"
AllowDrop="False"
IsInlineEditingEnabled="False"
UseDefaultCursorsOnDrag="False"
Height="400"
toolkit:DockPanel.Dock="Top">
</telerik:RadScheduleView>



Snippet of the code to build the appointment:

Dim appointment As New AdminDashboardRestrictedBusOrderAppointment()
        With appointment
 
.TextForeground = New SolidColorBrush(Colors.White)
            If scheduleItem.IsReviewed.HasValue Then
                If scheduleItem.IsReviewed.Value Then
                    If scheduleItem.IsFulfilled Then
                        .Background = New SolidColorBrush(Colors.Green)
                    Else
                        .Background = New SolidColorBrush(Color.FromArgb(255, 255, 165, 29))
                    End If
                Else
                    If String.IsNullOrWhiteSpace(scheduleItem.ReviewedUserId) Then
                        .Background = New SolidColorBrush(Colors.Purple)
                    Else
                        .Background = New SolidColorBrush(Colors.Red)
                    End If
                End If
            Else
                If scheduleItem.IsFulfilled Then
                    .Background = New SolidColorBrush(Colors.Green)
                Else
                    .Background = New SolidColorBrush(Color.FromArgb(255, 255, 165, 29))
                End If
            End If
 
End With


Is there any reason that can be seen as to why the attached screen shot would result (intermittently at that)?  The issue appointments I've added arrows to.

Mike
0
Yana
Telerik team
answered on 04 Feb 2013, 01:22 PM
Hi Michael,

I am not sure what could be the reason for this issue. Is it possible to send us a runnable project where we can observe the erroneous behavior? Thanks

All the best,
Yana
the Telerik team

Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

0
Michael MSTG
Top achievements
Rank 1
answered on 04 Feb 2013, 03:28 PM
Unfortunately I don't believe I can devote that much time for a full runnable project at this point.  The code I submitted is part of the logic where the appointment is generated.  What I added was the logic that deals with the colors.  The appointments are data driven in that I use a query to pull "orders" from a table.  The "subject" property is simply pulling the order ID to display so the logic before the color area is devoted to how the ID is displayed.  You have all the XAML I have. 

On the page init, this is what is run:
Me.OrderAppointments= New ObservableAppointmentCollection()
        svBusSchedule.AppointmentsSource = Me.OrderAppointments
        svBusSchedule.IsInlineEditingEnabled = False

The data source is set after the data is loaded (load callback):
Private Sub OrderSchedule_Loaded(ByVal results As LoadOperation(Of ScheduleItem))
        Me.OrderResources = New Telerik.Windows.Controls.ResourceTypeCollection()
        Me.OrderAppointments.Clear() 'ObservableAppointmentCollection
 
        'resources for grouping
        Dim vehicleNames As IEnumerable(Of String) = results.Entities.Select(Function(b) b.VehicleTypeDescription).Distinct()
        Dim vehicleResourceType As New Telerik.Windows.Controls.ResourceType("VehicleTypeDescription")
        Me.OrderResources.Add(vehicleResourceType)
 
        For Each vehicleName As String In vehicleNames
            vehicleResourceType.Resources.Add(New Telerik.Windows.Controls.Resource(vehicleName))
        Next
        svBusSchedule.ResourceTypesSource = Me.OrderResources
 
        'appointments
        For Each si As ScheduleItem In results.Entities
            Dim scheduleItem As ScheduleItem = si
            Dim resource As Telerik.Windows.Controls.IResource = (From r As Telerik.Windows.Controls.IResource
                                                                  In vehicleResourceType.Resources
                                                                  Where r.ResourceName = scheduleItem.VehicleTypeDescription).First()
 
            GenerateAppointment(scheduleItem, resource))
        Next
    End Sub


My problem has been that I have never seen this schedule viewer do this however I do not use it as much as the one user who presented the problem does.  If it is nothing obvious then I am at a loss.
Tags
ScheduleView
Asked by
Francisco Bernardo
Top achievements
Rank 1
Answers by
Dani
Telerik team
Francisco Bernardo
Top achievements
Rank 1
Michael MSTG
Top achievements
Rank 1
Yana
Telerik team
Share this question
or