Hello Telerik,
So far I could get my Grid cells styles to be dynamically changed based on my own roles, using this tutorial
http://docs.telerik.com/devtools/wpf/controls/radgridview/style-selectors/cell-style-selector.html
but there are two things left to be done regarding this issue.
still following the given approach, I want to:
- set an image to a checkbox, whether it is true or false.
- and also set that style in a separate file, so that it may be reused. inside a resourcedictionary file.
My point is, I will have several grids through my application using the same set of styles in their cells. based on each own role.
Please help me to achieve that!
8 Answers, 1 is accepted
You can apply a Style that targets the ":GridViewCheckBox" or "CheckBox"(depends on your exact scenario) and apply different images in the content based on the value through Style Triggers. Please check the attached project and consider such implementation at your end.
Please update me if such approach would be useful.
Regards,
Stefan Nenchev
Telerik
Hi Stefan,
That sample you provided is indeed helpful. There is just a small detail missing:
I need the "box" of the checkbox hidden, so that only the image will be displayed.
I tried
<Setter Property="Visibility" Value="Hidden" /> but then the whole thing will be hidden, obviously...
how can I proceed?
In such case, you can use a GridViewDataColumn and in its CellTemplate to add a Converter that returns a certain image based on the boolean value. The following thread should be helpful - Template Column show .
Regards,
Stefan Nenchev
Telerik
Hi Stefan.
When I tried to use the approach (the one that has a sample attached) from that topic,
Only the "unchecked" image shows. Because when the Convert class is hit, the "value" will always have this
{System.Windows.Controls.ContentControl}
instead of a Boolean. thus returning the unchecked image.
And there is no way to find the data value inside. the value I find shows null
here is my converter (which is pretty much the one of his sample)
using
System;
using
System.Windows.Data;
using
System.Windows.Media;
using
System.Windows.Media.Imaging;
namespace
TelerikVirtualization.Utils
{
public
class
BoolToImageConverter : IValueConverter
{
#region IValueConverter Members
public
object
Convert(
object
value, System.Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
if (value
is bool) <---- this line here. it is always ContentControl
{
if
((
bool
) value)
{
return
new
BitmapImage(
new
Uri(@
"Images/TrueImage.png"
, UriKind.Relative));
}
}
return
new
BitmapImage(
new
Uri(@
"Images/FalseImage.png"
, UriKind.Relative));
}
public
object
ConvertBack(
object
value, System.Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
return
value;
}
#endregion
}
}
My xaml is:
<
telerik:GridViewDataColumn
DataType
=
"{x:Null}"
UniqueName
=
"Discontinued"
>
<
telerik:GridViewColumn.CellStyle
>
<
Style
TargetType
=
"{x:Type telerik:GridViewCell}"
>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type telerik:GridViewCell}"
>
<
Image
Stretch
=
"UniformToFill"
Width
=
"50"
Height
=
"50"
Source
=
"{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, Converter = {StaticResource boolToImageConverter}}"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
telerik:GridViewColumn.CellStyle
>
</
telerik:GridViewDataColumn
>
I dont understand why that sample works and mine doesn't.
Please clarify why am I getting that object instead of a boolean
thank you !
You can use a DataTemplate within the Column`s CellTemplate:
<
telerik:GridViewDataColumn
DataMemberBinding
=
"{Binding Champion}"
>
<
telerik:GridViewDataColumn.CellTemplate
>
<
DataTemplate
>
<
Image
Height
=
"16"
Width
=
"16"
Source
=
"{Binding Path=Champion, Converter={StaticResource ImageConverter}}"
></
Image
>
</
DataTemplate
>
</
telerik:GridViewDataColumn.CellTemplate
>
</
telerik:GridViewDataColumn
>
And in the ImageConverter:
public
object
Convert(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
if
((
bool
)value ==
false
)
{
return
"Images/FalseImage.png"
;
}
else
{
return
"Images/TrueImage.png"
;
}
}
I have updated the project for your convenience.
Regards,
Stefan Nenchev
Telerik
Hi Stefan.
Then I get null pointer exception.
but I found what is causing the issue
Virtualization.
That is how I load my list. I reverted it to manual binding (observable collection) and it worked. however that is not my case.
Could you please use virtualization to your sample?
ViewModel.cs
public
VirtualQueryableCollectionView View {
get
;
set
; }
Controller controller;
public
ViewModel()
{
controller =
new
Controller();
}
public
void
Load(
bool
complete)
{
View =
new
VirtualQueryableCollectionView(controller.GetList(complete)) { LoadSize = 10 };
}
Controller.cs
public
class
Controller
{
public
IQueryable GetList(
bool
complete)
{
DataClasses1DataContext context =
new
DataClasses1DataContext();
var result = from x
in
context.MyTables
select
new
MyTableEntity() {
Date = x.Date.GetValueOrDefault(DateTime.Now),
Name = x.Name,
UnitPrice = x.UnitPrice.GetValueOrDefault(0),
id = x.ID,
Discontinued = x.Discontinued
,Image =
"/click_me.bmp"
,Name3 =
"anything goes"
,Name4 =
"anything goes"
,Name5 =
"anything goes"
,Name6 =
"anything goes"
,Name7 =
"anything goes"
,Name8 =
"anything goes"
,Name9 =
"anything goes"
,Children = complete ? (from y
in
context.MyChildTables
where y.ParentID == x.ID
select
new
MyChildTableEntity { ID = y.ID, Name = y.Name, ParentID = y.ParentID }) :
null
};
return
result;
}
XAML.cs
public
partial
class
MainWindow : Window
{
bool
complete =
false
;
public
MainWindow(
bool
complete)
{
InitializeComponent();
DataContext =
new
ViewModel();
this
.complete = complete;
}
private
void
Window_Loaded(
object
sender, RoutedEventArgs e)
{
((ViewModel)DataContext).Load(complete);
}
}
XAML
<
telerik:RadGridView
Name
=
"RadGridView"
ItemsSource
=
"{Binding View}"
IsReadOnly
=
"True"
Style
=
"{StaticResource VitorStyle}"
AutoGenerateColumns
=
"False"
>
Thank you
Adding a null check in your converter should be enough:
public
object
Convert(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
if
(value !=
null
)
{
if
((
bool
)value ==
false
)
{
return
"Images/FalseImage.png"
;
}
else
{
return
"Images/TrueImage.png"
;
}
}
return
value;
}
Regards,
Stefan Nenchev
Telerik
it WORKS!
Thank you!