/// <summary> /// Set the maximum length of a TextBox based on any StringLength attribute of the bound property /// </summary> public class RestrictStringInputBehavior : Behavior<TextBox> { protected override void OnAttached() { AssociatedObject.Loaded += (sender, args) => setMaxLength(); base.OnAttached(); } private void setMaxLength() { object context = AssociatedObject.DataContext; BindingExpression binding = AssociatedObject.GetBindingExpression(TextBox.TextProperty); if (context != null && binding != null) { PropertyInfo prop = context.GetType().GetProperty(binding.ParentBinding.Path.Path); if (prop != null) { var att = prop.GetCustomAttributes(typeof(StringLengthAttribute), true).FirstOrDefault() as StringLengthAttribute; if (att != null) { AssociatedObject.MaxLength = att.MaximumLength; } } } } } You can see, the behavior simply retrieves the data context of the text box, and its binding expression for "Text". Then it uses reflection to get the "StringLength" attribute. Usage is like this: <UserControl xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" <TextBox Text="{Binding SomeProperty}"> <i:Interaction.Behaviors> <local:RestrictStringInputBehavior /> </i:Interaction.Behaviors> </TextBox> </UserControl>
<UserControl xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" <TextBox Text="{Binding SomeProperty}"> <i:Interaction.Behaviors> <local:RestrictStringInputBehavior /> </i:Interaction.Behaviors> </TextBox> </UserControl>