This question is locked. New answers and comments are not allowed.
We are pre-populating the RadDataFilter in some places in our application with some filters; e.g. "Customer ID" Is EqualTo "12345". Is there any way to make filters read-only so that they are visible to the user but not editable/removable?
Thanks
Thanks
2 Answers, 1 is accepted
0
Hi,
I am afraid that RadDataFilter does not have such a feature.
Kind regards,
Ross
the Telerik team
I am afraid that RadDataFilter does not have such a feature.
Kind regards,
Ross
the Telerik team
Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>
0
Pete
Top achievements
Rank 1
answered on 10 Jul 2012, 09:46 AM
It is possible by extracting the templates from the Telerik.Windows.Controls.Data.dll file. I have created a "locked down" version of the datafilter so that the user can only change the operators and search values and nothing else. I post the result here for others:
The IsNotCompositeFilterConverter is used to remove the very top level logical operator:
To use, just set the template on the RadDataFilter:
<telerik:RadDataFilter Template="{StaticResource RadDataFilterTemplateSimple}" />
<
ResourceDictionary
xmlns
=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
xmlns:telerikData
=
"clr-namespace:Telerik.Windows.Data;assembly=Telerik.Windows.Data"
xmlns:dataFilter
=
"clr-namespace:Telerik.Windows.Controls.Data.DataFilter;assembly=Telerik.Windows.Controls.Data"
xmlns:Model
=
"clr-namespace:SimpleSearchRadDataFilterTest.Model"
xmlns:filteringEditors
=
"clr-namespace:Telerik.Windows.Controls.Filtering.Editors;assembly=Telerik.Windows.Controls"
>
<
Model:IsNotCompositeFilterConverter
x:Name
=
"IsNotCompositeFilterConverter"
/>
<
telerikData:FilterOperatorConverter
x:Key
=
"FilterOperatorConverter"
/>
<
SolidColorBrush
x:Key
=
"FilterControl_InnerBorder"
Color
=
"White"
/>
<
telerik:BooleanToVisibilityConverter
x:Key
=
"BooleanToVisibilityConverter"
/>
<
dataFilter:LogicalOperatorToCheckedConverter
x:Key
=
"LogicalOperatorToCheckedConverter"
/>
<
telerikData:FilterCompositionLogicalOperatorConverter
x:Key
=
"LogicalOperatorConverter"
/>
<
telerik:InvertedBooleanToVisibilityConverter
x:Key
=
"InvertedBooleanToVisibilityConverter"
/>
<
SolidColorBrush
x:Key
=
"SeparatorBorder"
Color
=
"Transparent"
/>
<
dataFilter:FilterOperatorToSelectedItemConverter
x:Key
=
"FilterOperatorToSelectedItemConverter"
/>
<
dataFilter:FilterMemberToEnabledConverter
x:Key
=
"FilterMemberToEnabledConverter"
/>
<
DataTemplate
x:Key
=
"FilterOperatorTemplate"
>
<
TextBlock
Text
=
"{Binding Converter={StaticResource FilterOperatorConverter}}"
/>
</
DataTemplate
>
<!--Styles-->
<!--FilterControl-->
<
ControlTemplate
x:Key
=
"FilterControlTemplate"
TargetType
=
"dataFilter:FilterControl"
>
<
Border
x:Name
=
"OuterBorder"
Visibility
=
"{Binding Converter={StaticResource IsNotCompositeFilterConverter}}"
BorderBrush
=
"{TemplateBinding BorderBrush}"
BorderThickness
=
"{TemplateBinding BorderThickness}"
CornerRadius
=
"11"
>
<
Border.OpacityMask
>
<
LinearGradientBrush
EndPoint
=
"1,0.5"
StartPoint
=
"0,0.5"
>
<
GradientStop
Offset
=
"0"
Color
=
"Black"
/>
<
GradientStop
Offset
=
"0.3"
/>
</
LinearGradientBrush
>
</
Border.OpacityMask
>
<
Border.Triggers
>
<
EventTrigger
RoutedEvent
=
"Canvas.Loaded"
>
<
BeginStoryboard
>
<
Storyboard
>
<
DoubleAnimation
Duration
=
"0:0:0.2"
To
=
"1"
Storyboard.TargetProperty
=
"(UIElement.OpacityMask).(GradientBrush.GradientStops)[0].(GradientStop.Offset)"
Storyboard.TargetName
=
"OuterBorder"
/>
<
DoubleAnimation
Duration
=
"0:0:0.2"
To
=
"1"
Storyboard.TargetProperty
=
"(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].(GradientStop.Offset)"
Storyboard.TargetName
=
"OuterBorder"
/>
<
ColorAnimation
Duration
=
"0"
BeginTime
=
"0:0:0.2"
To
=
"Black"
Storyboard.TargetProperty
=
"(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
Storyboard.TargetName
=
"OuterBorder"
/>
</
Storyboard
>
</
BeginStoryboard
>
</
EventTrigger
>
</
Border.Triggers
>
<
Border
x:Name
=
"InnerBorder"
Background
=
"{TemplateBinding Background}"
BorderBrush
=
"{StaticResource FilterControl_InnerBorder}"
BorderThickness
=
"{TemplateBinding BorderThickness}"
CornerRadius
=
"10"
>
<
StackPanel
Orientation
=
"Horizontal"
Margin
=
"10,0,10,0"
>
<
StackPanel
Orientation
=
"Horizontal"
Visibility
=
"{Binding IsComposite, Converter={StaticResource BooleanToVisibilityConverter}}"
>
<
TextBlock
Text
=
"{Binding CompositeFilter.LogicalOperator, Converter={StaticResource LogicalOperatorConverter}}"
></
TextBlock
>
<
telerik:RadToggleButton
Visibility
=
"Collapsed"
Name
=
"PART_CompositeFilterLogicalOperatorToggleButton"
Height
=
"18"
FontSize
=
"10"
MinWidth
=
"30"
IsChecked
=
"{Binding CompositeFilter.LogicalOperator, Mode=TwoWay, Converter={StaticResource LogicalOperatorToCheckedConverter}}"
Content
=
"{Binding CompositeFilter.LogicalOperator, Converter={StaticResource LogicalOperatorConverter}}"
/>
</
StackPanel
>
<
StackPanel
Orientation
=
"Horizontal"
Visibility
=
"{Binding IsComposite, Converter={StaticResource InvertedBooleanToVisibilityConverter}}"
>
<
TextBlock
x:Name
=
"IRISSimpleFilterMemberLabel"
VerticalAlignment
=
"Center"
Margin
=
"0,0,3,0"
Text
=
"{Binding SimpleFilter.SelectedMember}"
Width
=
"200"
/>
<
telerik:RadComboBox
Name
=
"PART_SimpleFilterOperatorComboBox"
Margin
=
"0,0,3,0"
Width
=
"150"
VerticalAlignment
=
"Center"
ItemsSource
=
"{Binding SimpleFilter.AvailableOperators}"
SelectedItem
=
"{Binding SimpleFilter.Operator, Mode=TwoWay, Converter={StaticResource FilterOperatorToSelectedItemConverter}}"
IsEnabled
=
"{Binding SimpleFilter.Member, Converter={StaticResource FilterMemberToEnabledConverter}}"
ItemTemplate
=
"{StaticResource FilterOperatorTemplate}"
/>
<
dataFilter:FilterEditor
DataContext
=
"{Binding SimpleFilter}"
ItemPropertyDefinition
=
"{Binding SelectedMember}"
FilterOperator
=
"{Binding Operator}"
Width
=
"150"
IsEnabled
=
"{Binding IsFilterEditorEnabled}"
HorizontalContentAlignment
=
"Stretch"
VerticalContentAlignment
=
"Stretch"
/>
</
StackPanel
>
</
StackPanel
>
</
Border
>
</
Border
>
</
ControlTemplate
>
<
Style
x:Key
=
"FilterControlStyle"
TargetType
=
"dataFilter:FilterControl"
>
<
Setter
Property
=
"Template"
Value
=
"{StaticResource FilterControlTemplate}"
/>
</
Style
>
<!--DataFilterPresenter-->
<
ControlTemplate
x:Key
=
"DataFilterPresenterTemplate"
TargetType
=
"dataFilter:DataFilterPresenter"
>
<
Border
Padding
=
"20, 2, 0, 2"
>
<
Grid
x:Name
=
"Root"
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"Auto"
/>
<
RowDefinition
Height
=
"*"
/>
</
Grid.RowDefinitions
>
<
ContentControl
x:Name
=
"HeaderContent"
Grid.Row
=
"0"
Content
=
"{TemplateBinding Header}"
ContentTemplate
=
"{TemplateBinding HeaderTemplate}"
IsTabStop
=
"False"
/>
<
ItemsPresenter
x:Name
=
"Items"
Grid.Row
=
"1"
/>
</
Grid
>
</
Border
>
</
ControlTemplate
>
<
telerik:HierarchicalDataTemplate
x:Key
=
"DataFilterPresenterItemTemplate"
ItemsSource
=
"{Binding CompositeFilter.Filters}"
>
<
dataFilter:FilterControl
Style
=
"{StaticResource FilterControlStyle}"
/>
</
telerik:HierarchicalDataTemplate
>
<
DataTemplate
x:Key
=
"DataFilterPresenterHeaderTemplate"
>
<
dataFilter:FilterControl
Style
=
"{StaticResource FilterControlStyle}"
/>
</
DataTemplate
>
<
Style
x:Key
=
"DataFilterPresenterStyle"
TargetType
=
"dataFilter:DataFilterPresenter"
>
<
Setter
Property
=
"Template"
Value
=
"{StaticResource DataFilterPresenterTemplate}"
/>
<
Setter
Property
=
"ItemTemplate"
Value
=
"{StaticResource DataFilterPresenterItemTemplate}"
/>
<
Setter
Property
=
"HeaderTemplate"
Value
=
"{StaticResource DataFilterPresenterHeaderTemplate}"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
</
Style
>
<!--RadDataFilter-->
<
ControlTemplate
x:Key
=
"RadDataFilterTemplateSimple"
TargetType
=
"telerik:RadDataFilter"
>
<
ScrollViewer
ScrollViewer.HorizontalScrollBarVisibility
=
"Auto"
ScrollViewer.VerticalScrollBarVisibility
=
"Auto"
>
<
dataFilter:DataFilterPresenter
DataContext
=
"{TemplateBinding ViewModel}"
Header
=
"{Binding .}"
ItemsSource
=
"{Binding CompositeFilter.Filters}"
Style
=
"{StaticResource DataFilterPresenterStyle}"
/>
</
ScrollViewer
>
</
ControlTemplate
>
<!--StringFilterEditor-->
<
ControlTemplate
x:Key
=
"StringFilterEditorTemplate"
TargetType
=
"filteringEditors:StringFilterEditor"
>
<
Grid
MinWidth
=
"100"
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
Width
=
"*"
/>
<
ColumnDefinition
Width
=
"Auto"
/>
</
Grid.ColumnDefinitions
>
<
TextBox
Grid.Column
=
"0"
Text
=
"{Binding Text, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
VerticalAlignment
=
"Stretch"
telerik:TextBoxBehavior.UpdateTextOnEnter
=
"True"
telerik:TextBoxBehavior.SelectAllOnGotFocus
=
"True"
/>
</
Grid
>
</
ControlTemplate
>
<
Style
x:Key
=
"StringFilterEditorStyle"
TargetType
=
"filteringEditors:StringFilterEditor"
>
<
Setter
Property
=
"Template"
Value
=
"{StaticResource StringFilterEditorTemplate}"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
</
Style
>
<
Style
TargetType
=
"filteringEditors:StringFilterEditor"
BasedOn
=
"{StaticResource StringFilterEditorStyle}"
/>
</
ResourceDictionary
>
The IsNotCompositeFilterConverter is used to remove the very top level logical operator:
public class IsNotCompositeFilterConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var root = value as Telerik.Windows.Controls.Data.DataFilter.RootFilterViewModel;
if (root == null)
{
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
To use, just set the template on the RadDataFilter:
<telerik:RadDataFilter Template="{StaticResource RadDataFilterTemplateSimple}" />