or
When a property return type is ArraySegment<T> and properties are auto-generated, an exception is thrown and the control is not displayed.
My example specifically:
public
class
TestClass
{
private
readonly
ArraySegment<
string
> _strings;
public
IReadOnlyList<
string
> Strings
{
get
{
return
this
._strings; }
}
}
<
Grid
>
<
Grid.Resources
>
<
local:BooleanConverter
x:Key
=
"BooleanConverter"
/>
<
local:InvBooleanConverter
x:Key
=
"InvBooleanConverter"
/>
<
local:StringToIntConverter
x:Key
=
"StringToIntConverter"
/>
<
local:StringToDblConverter
x:Key
=
"StringToDblConverter"
/>
<
local:SettingValueTemplateSelector
x:Key
=
"SettingValueTemplateSelector"
>
<
local:SettingValueTemplateSelector.BooleanTemplate
>
<
DataTemplate
>
<
StackPanel
Orientation
=
"Horizontal"
>
<
telerik:RadRadioButton
IsChecked
=
"{Binding Path=Value}"
>
<
TextBlock
Text
=
"Enabled"
/>
</
telerik:RadRadioButton
>
<
telerik:RadRadioButton
IsChecked
=
"{Binding Path=Value}"
>
<
TextBlock
Text
=
"Disabled"
/>
</
telerik:RadRadioButton
>
</
StackPanel
>
</
DataTemplate
>
</
local:SettingValueTemplateSelector.BooleanTemplate
>
<
local:SettingValueTemplateSelector.IntTemplate
>
<
DataTemplate
>
<
telerik:RadNumericUpDown
Value
=
"{Binding Path=Value, Converter={StaticResource StringToIntConverter}}"
NumberDecimalDigits
=
"0"
/>
</
DataTemplate
>
</
local:SettingValueTemplateSelector.IntTemplate
>
<
local:SettingValueTemplateSelector.DoubleTemplate
>
<
DataTemplate
>
<
telerik:RadNumericUpDown
Value
=
"{Binding Path=Value,Converter={StaticResource StringToDblConverter}}"
/>
</
DataTemplate
>
</
local:SettingValueTemplateSelector.DoubleTemplate
>
<
local:SettingValueTemplateSelector.StringTemplate
>
<
DataTemplate
>
<
TextBlock
Text
=
"{Binding Path=Value, Mode=TwoWay}"
/>
</
DataTemplate
>
</
local:SettingValueTemplateSelector.StringTemplate
>
</
local:SettingValueTemplateSelector
>
</
Grid.Resources
>
<
telerik:RadGridView
x:Name
=
"RadGridView"
GroupRenderMode
=
"Flat"
RowIndicatorVisibility
=
"Collapsed"
CanUserFreezeColumns
=
"False"
ItemsSource
=
"{Binding ElementName=Window1, Path=List}"
IsReadOnly
=
"false"
ScrollMode
=
"Deferred"
AutoExpandGroups
=
"True"
AutoGenerateColumns
=
"false"
Margin
=
"0,2,0,-2"
>
<
telerik:RadGridView.Columns
>
<
telerik:GridViewDataColumn
Header
=
"Value"
IsGroupable
=
"True"
DataMemberBinding
=
"{Binding Value}"
CellTemplateSelector
=
"{StaticResource SettingValueTemplateSelector}"
Background
=
"LightGray"
>
</
telerik:GridViewDataColumn
>
<
telerik:GridViewDataColumn
Header
=
"ValueType"
IsGroupable
=
"True"
DataMemberBinding
=
"{Binding ValueType}"
Background
=
"LightGray"
>
</
telerik:GridViewDataColumn
>
</
telerik:RadGridView.Columns
>
</
telerik:RadGridView
>
</
Grid
>
Template selector:public
class
SettingValueTemplateSelector : DataTemplateSelector
{
public
override
DataTemplate SelectTemplate(
object
item, DependencyObject container)
{
if
(item
is
DataObjecten)
{
DataObjecten model = item
as
DataObjecten;
if
(model.ValueType ==
typeof
(
int
))
return
this
.IntTemplate;
else
if
(model.ValueType ==
typeof
(String))
return
this
.StringTemplate;
else
if
(model.ValueType ==
typeof
(
double
))
return
this
.DoubleTemplate;
else
if
(model.ValueType ==
typeof
(
bool
))
return
this
.BooleanTemplate;
else
return
null
;
}
return
null
;
}
}
One of the converters (basic):public
class
StringToIntConverter : IValueConverter
{
public
object
Convert(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
int
retValue=0;
if
(
int
.TryParse(value.ToString(),
out
retValue))
{
return
retValue;
}
else
return
0;
}
public
object
ConvertBack(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
throw
new
NotSupportedException(
"Do not use this converter for objects other than boolean"
);
}
}
Model:public
class
DataObject
{
public
object
Value {
get
;
set
; }
public
Type ValueType {
get
;
set
; }
}
List.Add(
new
DataObject() { Value =
"8"
, ValueType =
typeof
(
int
) });
List.Add(
new
DataObject() { Value =
"8"
, ValueType =
typeof
(
double
) });
List.Add(
new
DataObject() { Value =
"8gf"
, ValueType =
typeof
(
string
) });
List.Add(
new
DataObject() { Value = 454365, ValueType =
typeof
(
int
) });
List.Add(
new
DataObject() { Value =
false
, ValueType =
typeof
(
bool
) });
<
DataGridTemplateColumn
x:Name
=
"amountEarnedColumn"
Header
=
"Amount Earned"
Width
=
"SizeToHeader"
>
<
DataGridTemplateColumn.CellTemplate
>
<
DataTemplate
>
<
telerik:RadMaskedCurrencyInput
Value
=
"{Binding AmountEarned}"
Mask
=
"c5.2"
Placeholder
=
" "
/>
</
DataTemplate
>
</
DataGridTemplateColumn.CellTemplate
>
<
DataGridTemplateColumn.CellEditingTemplate
>
<
DataTemplate
>
<
telerik:RadMaskedCurrencyInput
Value
=
"{Binding AmountEarned}"
/>
</
DataTemplate
>
</
DataGridTemplateColumn.CellEditingTemplate
>
</
DataGridTemplateColumn
>