Add a property to the RadGridView that provides a distinct template for adding a new row.
Sometimes you have classes with no default constructor. Those classes may have properties that are read-only after construction. This cannot be handled in the RadGridView, because you only have the choice of a CellEditTemplate. (I'm envisioning something akin to the RowDetailsTemplate.)
Example: I have a class that defines a invoice match for payment application. Once the invoice is set it cannot be changed. The user can still edit the match, but they're only allowed to edit the amount to be applied.
Setting the theme via the StyleManager.SetTheme(control, theme) method does not style the cell as expected when a CellStyle is defined for its parent column. The current workaround is to explicitly set the theme via the style: <Style x:Key="BlueCellStyle" TargetType="telerik:GridViewCell"> <Setter Property="Background" Value="PowderBlue"/> <Setter Property="telerik:StyleManager.Theme" Value="VisualStudio2013" /> </Style>
As a workaround, the Path with the PathGeometry setter in the style can be replaced by a RadGlyph with a pin icon. The IsPinned Trigger in the style can be replaced with a DataTrigger to the parent row's IsPinned. Here's an example of the updated style for the Fluent theme: <Style x:Key="GridViewPinButtonStyle" TargetType="grid:GridViewPinButton"> <Setter Property="PathStyle" Value="{StaticResource PinUnpinPathStyle}"/> <Setter Property="Foreground" Value="{telerik1:FluentResource ResourceKey=IconBrush}"/> <Setter Property="MinHeight" Value="28"/> <Setter Property="MinWidth" Value="22"/> <Setter Property="IsBackgroundVisible" Value="False"/> <Setter Property="Command" Value="{x:Static telerik:RadGridViewCommands.TogglePinnedRowState}"/> <Setter Property="CommandParameter" Value="{Binding}"/> <Setter Property="SnapsToDevicePixels" Value="True"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> <Setter Property="VerticalContentAlignment" Value="Stretch"/> <Setter Property="FocusVisualStyle" Value="{x:Null}"/> <Setter Property="IsTabStop" Value="False"/> <Setter Property="Padding" Value="0 0 2 0"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="telerik:RadPathButton"> <Grid Background="Transparent"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="BackgroundVisibility"> <VisualState x:Name="BackgroundIsHidden"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="OuterBorder" Storyboard.TargetProperty="Visibility"> <DiscreteObjectKeyFrame KeyTime="0"> <DiscreteObjectKeyFrame.Value> <Visibility>Collapsed</Visibility> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="BackgroundIsVisible"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Border x:Name="OuterBorder" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" CornerRadius="{TemplateBinding CornerRadius}"/> <telerik:RadGlyph x:Name="UnPinIcon" Foreground="{TemplateBinding Foreground}" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center" Glyph="{StaticResource GlyphPin}"/> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Foreground" Value="{telerik1:FluentResource ResourceKey=AccentMouseOverBrush}"/> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Foreground" Value="{telerik1:FluentResource ResourceKey=AccentPressedBrush}"/> </Trigger> <DataTrigger Binding="{Binding IsPinned, RelativeSource={RelativeSource AncestorType=telerik:GridViewRow}}" Value="True"> <Setter TargetName="UnPinIcon" Property="Glyph" Value="{StaticResource GlyphUnpin}" /> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> ArgumentException: 'RadGlyphExtension' is not valid for Setter.Value. The only supported MarkupExtension types are DynamicResourceExtension and BindingBase or derived types. StackTrace: at System.Windows.Setter.Seal() at System.Windows.SetterBaseCollection.Seal() at System.Windows.Style.Seal() at System.Windows.Style.Seal() at System.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style newStyle, Style& styleCache) at System.Windows.FrameworkElement.OnStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args) at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType) at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue) at System.Windows.FrameworkElement.UpdateStyleProperty() at System.Windows.FrameworkElement.OnInitialized(EventArgs e) at Telerik.Windows.Controls.RadButton.OnInitialized(EventArgs e) at Telerik.Windows.Controls.RadPathButton.OnInitialized(EventArgs e) at Telerik.Windows.Controls.GridView.GridViewPinButton.OnInitialized(EventArgs e) at System.Windows.FrameworkElement.TryFireInitialized() at System.Windows.FrameworkElement.EndInit() at MS.Internal.Xaml.Runtime.ClrObjectRuntime.InitializationGuard(XamlType xamlType, Object obj, Boolean begin)
Currently search tries to match the search value to the complex object value, which always provides negative results. Adding such property will enable search over a primitive type, or string property of the given object.
To work this around set the GroupRenderMode property of RadGridView to Flat.
When GroupRenderMode is set to Nested the issue can be overcome by calling the BringIntoView method on the row returned in the ScrollIntoViewAsync method's callback:gridView.ScrollIndexIntoViewAsync(index,
new
Action<FrameworkElement>((f) =>
{
f.BringIntoView();
}));