2011-04-21 6 views
4

나는 사용자 정의 컨트롤에 텍스트 상자를 가지고 :바인딩 스타일?

<TextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}"></TextBox> 
<TextBox Text="{Binding Path=Street, UpdateSourceTrigger=PropertyChanged}"></TextBox> 

나는 각 텍스트 상자 작성하지 않도록 내 바인딩의 스타일과 같은 작업을 수행하는 XAML의 방법이되는 UpdateSourceTrigger=PropertyChanged하지만, Path= 부분 만?

미리 감사드립니다.

답변

2

아니요, XAML 또는 스타일을 통해이를 수행 할 방법이 없습니다. 기본 동작을 변경하는 사용자 지정 컨트롤을 만드는 것이 가장 좋습니다. 같은 뭔가 :

public class MyTextBox : TextBox { 
    static MyTextBox() { 
     TextProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata() { DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }); 
    } 
} 

그런 다음 당신은 TextBox 대신에 MyTextBox를 사용할 필요가 것입니다. (

+0

감사합니다. 이미 그 솔루션을 사용하고 있었지만 XAML과 관련하여 뭔가 빠져 있기를 바랬습니다. 불행히도. – Dummy01

5

는 너무 미친 긴 바인딩 문구 내가 속성에 바인딩하고 싶어 매주 시간을 쓰기에 진짜 짜증 가지고, 그래서 그것은 기본적으로 MarkupExtension를 서브 클래스 년 이상 내가 this post.

우연히 발견하기 전에 그랬어 (Binding 클래스)는 BindingDecoratorBase이라는 추상 클래스에 바인딩 클래스가 제공하는 모든 속성을 제공합니다. 그래서 거기에서 당신은 이런 식으로 뭔가를 할 수 :

public class SimpleBinding : BindingDecoratorBase 
{ 
    public SimpleBinding(string path) : this() 
    { 
    Path = new System.Windows.PropertyPath(path); 
    } 
    public SimpleBinding() 
    { 
    TargetNullValue = string.Empty; 
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
    } 
} 

을 그리고 당신이 당신의 XAML에서 할 일은 상단에 네임 스페이스를 포함하고 다음 컨트롤에 바인딩하는 것은 같은 것을 할 :

<TextBox Text="{m:SimpleBinding Name}"></TextBox> 
<TextBox Text="{m:SimpleBinding Street}"></TextBox> 

이렇게하면 바인딩 문구에서 적게 쓰고 싶은 모든 컨트롤을 하위 클래스로 만드는 것보다 쉽게 ​​만듭니다.

+0

서브 클래 싱보다 훨씬 나은 접근법입니다. 여기에서 모든 컨트롤의 바인딩에이 기술을 적용 할 수 있습니다. 이 기법으로 어떤 부족한 점이 있습니까? –

+0

사실, 그 반대입니다. 그것은 나에게 더 많은 통제권을 주었다. NotConverter를 사용하여 IsEnabled에 속성을 바인딩했지만이 방법을 사용하면 C# 구문을 허용하고 MarkupExtension이 나를 무효화하도록했습니다. 그래서 MarkupExtension은이 문법을 허용합니다. ""{m : SimpleBinding! IsEnabled} "'. – Jose

관련 문제