2016-09-10 2 views
1

나는 현재 다음과 같은 스택 패널의 레이블과 텍스트 상자로 구성 것이다 처음 사용자 컨트롤을 쓰고 있어요 :사용자 컨트롤의 모든 기본 속성에 대한 종속성 속성이 필요합니까?

<Grid> 
    <StackPanel Orientation="Horizontal" DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
     <Label Content="{Binding Label}" Width="60"></Label> 
     <TextBox Text="{Binding TextBoxContent}" Width="60"/> 
    </StackPanel> 
</Grid> 

이있을 것 같은이는 설정 페이지에있는 가장 도움이 될 것입니다 몇 가지 다른 설정을 위해 재사용됩니다. 이러한 각 설정을 통해 폭, 높이, 유효성 검사 규칙 및 오류 템플릿 속성을 (최소한) 설정하려고합니다. 텍스트 자체에 대해서는 이미 레이블과 텍스트 상자에 대한 종속성 속성을 만들었습니다 (위의 스 니펫에서 볼 수 있듯이).

내 질문은 : 사용자 정의 컨트롤을 실제로 사용할 때 설정하려는 모든 속성에 대한 종속성 속성을 만들어야합니까? 이것은 중복 작업처럼 보입니다 (텍스트 상자에 이미 존재하기 때문에 기본적으로 사용자 정의 컨트롤의 속성을 동일한 이름의 텍스트 상자 속성으로 리디렉션 할 것입니다). 내 텍스트 상자 (예 : AcceptsReturn 등)에서 더 많은 속성을 사용하려면이 작업이 훨씬 더 필요합니다.

당신이 TextBox보다는 UserControl에서 파생하기로 결정한 경우 중복 작업을 저장할 수 있습니다
+1

원하지 않는 TextBox에 뭔가가 없다면 TextBox를 하위 클래스로 만듭니다. 또는 TextBoxBase. 즉, 속성은 바인딩 대상이되어야하며 INotifyPropertyChanged를 지원하고 값이 변경 될 때 PropertyChanged를 발생시키지 않는 한 (유용한) 바인딩 소스가되어야하는 종속성 속성이어야합니다. 나는 그것이 작동하는지 말할 수 없으며, 조각으로 DP를 생성하므로 큰 번거 로움이 따릅니다.) 따라서 DP가 필요하지 않을 수도 있습니다. –

+2

_ "기본적으로 그들은 내 사용자 정의 컨트롤의 속성을 같은 이름의 텍스트 상자의 속성으로 리디렉션합니다."- 왜 그렇게할까요? 왜 그렇지 않을까요? UserControl.Width와 Height 속성은 사용자 정의 컨트롤의 너비와 높이를 제어합니다. 'TextBox'와 다른 자식들을 컨테이너의 차원, 즉'UserControl'에 기반하여 레이아웃하지 않아야합니까? 쉬운 패스 스루를 원한다면 어쩌면 전체'UserControl' 대신'ControlTemplate'을 만들고 내부에 {TemplateBinding}을 사용하는 것이 더 합리적 일 것입니다. –

+0

@EdPlunkett 그것에 대해 생각해 보지 않았습니다. 그래도 내 XAML의 "실제"TextBox의 각 속성을 TextBox 클래스에서 상속 한 내 사용자 정의 컨트롤의 속성에 수동으로 바인딩 할 필요가 없습니까? } 'TextBox 텍스트 = {바인딩 관계형 소스 = {RelativeSource FindAncestor, AncestorType = {x : 유형 UserControl}, 경로 = 텍스트}} 너비 = "60"/> // 테스트되지 않은 코드 ' – Choub890

답변

1

- 그냥 "이라는 텍스트 상자"와 같은 컨트롤의 생각은 TextBox에서 파생하고 수용하기 위해 필요한 종속성 속성을 추가하기 만하면 모든 라벨에. 이것은 물론 복잡한 사용자 컨트롤에는 해당되지 않지만, 귀하의 경우에는 괜찮은 것 같습니다.

그러나 단점은 TextBox에 대한 기본 제어 템플릿을 가져와 레이블을 추가하는 작업이 조금 복잡 할 수 있다는 것입니다.

어느 쪽이든, 저는 WPF에서 첫 번째 컨트롤을 작성할 때 MSDN의 Control Authoring Overview 페이지를 살펴 보는 것이 좋습니다.

관련 문제