나는 현재 다음과 같은 스택 패널의 레이블과 텍스트 상자로 구성 것이다 처음 사용자 컨트롤을 쓰고 있어요 :사용자 컨트롤의 모든 기본 속성에 대한 종속성 속성이 필요합니까?
<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
에서 파생하기로 결정한 경우 중복 작업을 저장할 수 있습니다
원하지 않는 TextBox에 뭔가가 없다면 TextBox를 하위 클래스로 만듭니다. 또는 TextBoxBase. 즉, 속성은 바인딩 대상이되어야하며 INotifyPropertyChanged를 지원하고 값이 변경 될 때 PropertyChanged를 발생시키지 않는 한 (유용한) 바인딩 소스가되어야하는 종속성 속성이어야합니다. 나는 그것이 작동하는지 말할 수 없으며, 조각으로 DP를 생성하므로 큰 번거 로움이 따릅니다.) 따라서 DP가 필요하지 않을 수도 있습니다. –
_ "기본적으로 그들은 내 사용자 정의 컨트롤의 속성을 같은 이름의 텍스트 상자의 속성으로 리디렉션합니다."- 왜 그렇게할까요? 왜 그렇지 않을까요? UserControl.Width와 Height 속성은 사용자 정의 컨트롤의 너비와 높이를 제어합니다. 'TextBox'와 다른 자식들을 컨테이너의 차원, 즉'UserControl'에 기반하여 레이아웃하지 않아야합니까? 쉬운 패스 스루를 원한다면 어쩌면 전체'UserControl' 대신'ControlTemplate'을 만들고 내부에 {TemplateBinding}을 사용하는 것이 더 합리적 일 것입니다. –
@EdPlunkett 그것에 대해 생각해 보지 않았습니다. 그래도 내 XAML의 "실제"TextBox의 각 속성을 TextBox 클래스에서 상속 한 내 사용자 정의 컨트롤의 속성에 수동으로 바인딩 할 필요가 없습니까? } 'TextBox 텍스트 = {바인딩 관계형 소스 = {RelativeSource FindAncestor, AncestorType = {x : 유형 UserControl}, 경로 = 텍스트}} 너비 = "60"/> // 테스트되지 않은 코드 ' – Choub890