TextBox를 바인딩 된 속성의 유효성 검사 속성 (있는 경우)에 연결하기 위해 Behavior을 사용했습니다. 동작은 다음과 같습니다
/// <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;
}
}
}
}
}
당신이 볼 수있는, 행동이 단순히 텍스트 상자의 데이터 컨텍스트를 검색하고 "텍스트"에 대한 바인딩 식. 그런 다음 리플렉션을 사용하여 "StringLength"특성을 얻습니다.
<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>
당신은 또한 TextBox
을 확장하여이 기능을 추가 할 수 있지만, 나는 그들이 모듈 형이기 때문에 비헤이비어를 사용하여 같은 : 사용법이 같다.
예, 저는 그것에 대해 생각해 보았습니다. 그러나 메타 데이터를 반영한 모든 속성을 추가하고 속성을 추가하는 것을 피하고 싶었습니다. 그런 다음 내 모든 xaml을 통과하여 해당 속성에 바인딩했습니다. 표지 "유형의 ... 아마 붙어있는 행동에 의해? – michael
"SomeProperty"를 문자열 값과 maxlength 값을 포함하는 개체로 변경 한 다음 해당 속성에 각각 바인딩 할 수 있습니다. 이렇게하면 새 속성을 만들 필요는 없지만 xaml 변경을 계속해야합니다. – evasilchenko