Użyłem Behavior do połączenia TextBox z atrybutem weryfikacji właściwości powiązanej (jeśli jest). Zachowanie wygląda następująco:
/// <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;
}
}
}
}
}
Można zobaczyć, zachowanie po prostu pobiera kontekst danych w polu tekstowym, a jego ekspresja wiążący dla „Tekst”. Następnie używa odbicia, aby uzyskać atrybut "StringLength". Wykorzystanie jest tak:
<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>
Można też dodać tę funkcjonalność poprzez rozszerzenie TextBox
, ale lubię za pomocą zachowań, ponieważ mają budowę modułową.
Tak, myślałem o tym, ale naprawdę chciałem uniknąć przechodzenia przez dodatkowe właściwości, które odzwierciedlają moje metadane, a następnie przechodzenie przez wszystkie moje xaml i wiązanie z tymi właściwościami ... Miałem nadzieję na "pod obejmuje "rodzaj drogi ... może przez przywiązane zachowania? – michael
Możesz zmienić "SomeProperty" na obiekt, który zawiera wartość ciągu i wartość maksymalnej długości, a następnie powiąż odpowiednio te właściwości. W ten sposób nie będziesz musiał tworzyć nowych właściwości, ale nadal będziesz musiał przejść przez zmiany xaml. – evasilchenko