Usage:
[System.ComponentModel.DataAnnotations.Range(0, 2)]
//[Display(...)]
public
int
UpperLabelColumn
{
get
{
return
_upperLabelColumn; }
set
{ Set(() => UpperLabelColumn,
ref
_upperLabelColumn, value); }
}
In XAML:
<
DataTemplate
>
<
t:RadNumericUpDown
t:AutoBindBehavior.UpdateBindingOnElementLoaded
=
"Value"
IsInteger
=
"True"
>
<
i:Interaction.Behaviors
>
<
bs:RadNumericUpDownAttributeBehavior
/>
</
i:Interaction.Behaviors
>
</
t:RadNumericUpDown
>
</
DataTemplate
>
Implementation:
public
class
RadNumericUpDownAttributeBehavior : Behavior<RadNumericUpDown>
{
protected
override
void
OnAttached()
{
AssociatedObject.Loaded += OnLoaded;
AssociatedObject.DataContextChanged += OnDataContextChanged;
}
protected
override
void
OnDetaching()
{
AssociatedObject.Loaded -= OnLoaded;
AssociatedObject.DataContextChanged -= OnDataContextChanged;
}
private
void
OnLoaded(
object
sender, RoutedEventArgs e)
{
UpdateBinding((RadNumericUpDown) sender);
}
private
void
OnDataContextChanged(
object
sender, DependencyPropertyChangedEventArgs e)
{
UpdateBinding((RadNumericUpDown)sender);
}
private
void
UpdateBinding(RadNumericUpDown sender)
{
var binding = sender.GetBindingExpression(RadRangeBase.ValueProperty);
if
(binding ==
null
)
return
;
var attributes = GetCustomAttributes(binding.DataItem, binding.ParentBinding.Path.Path);
if
(attributes ==
null
|| attributes.Length == 0)
return
;
var rangeAttribute = attributes.OfType<RangeAttribute>().FirstOrDefault();
if
(rangeAttribute ==
null
)
return
;
sender.Minimum = Convert.ToDouble(rangeAttribute.Minimum);
sender.Maximum = Convert.ToDouble(rangeAttribute.Maximum);
}
protected
static
object
[] GetCustomAttributes(
object
source,
string
propertyPath)
{
if
(source ==
null
||
string
.IsNullOrEmpty(propertyPath))
return
null
;
PropertyInfo propertyInfo =
null
;
var currentType = source.GetType();
var path = propertyPath.Split(
'.'
);
for
(
int
i = 0, count = path.Length; i < count; i++)
{
var propertyStep = path[i];
propertyInfo = currentType.GetProperty(propertyStep);
if
(propertyInfo ==
null
|| source ==
null
|| i == count - 1)
break
;
source = propertyInfo.GetValue(source,
null
);
currentType = propertyInfo.PropertyType;
}
return
propertyInfo !=
null
? propertyInfo.GetCustomAttributes(
true
) :
null
;
}
}
Microsoft Silverlight (64-bit) Version: 5.1.41105.0
Windows 8.1 (64-bit)
Internet Explorer 11.0.9600.17416
Telerik 2017.1.117.1050