2011-08-17 3 views
4

해당 모델/VM에 설정된 유효성 검사 규칙에 따라 오류 메시지를 표시하거나 축소하는 텍스트 상자를 만들었습니다. 코드는 전을 위해 이메일을 다음과 같이 간다 : 나는 이들의 무리를 가지고 있기 때문에, 나는 일반적인 리소스 파일에서이 컨트롤 템플릿이 모두 넣어 재배치 좋아했을WPF 컨트롤 템플릿의 중첩 바인딩

<StackPanel Grid.Row="3" Grid.Column="1"> 
     <TextBox MaxLength="200" x:Name="mailTextBox" 
       Style="{StaticResource SectionEditPropertyTextBox}" 
       Text="{Binding Email, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" /> 
     <ContentPresenter Visibility="{Binding ElementName=mailTextBox, Path=(Validation.HasError), Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=True }" 
       Content="{Binding ElementName=mailTextBox, Path=(Validation.Errors).CurrentItem}" 
       HorizontalAlignment="Left"> 
      <ContentPresenter.ContentTemplate> 
       <DataTemplate> 
        <Label Style="{StaticResource SectionEditErrorLabel}" Content="{Binding Path=ErrorContent}"/> 
       </DataTemplate> 
      </ContentPresenter.ContentTemplate> 
     </ContentPresenter> 
    </StackPanel> 

.

내 템플릿은 다음과 같습니다

<ControlTemplate x:Key="FormTextBox" TargetType="{x:Type TextBox}"> 
    <StackPanel Grid.Row="{TemplateBinding Grid.Row}" Grid.Column="{TemplateBinding Grid.Column}"> 
     <TextBox x:Name="validableText" MaxLength="{TemplateBinding MaxLength}" 
       Style="{StaticResource SectionEditPropertyTextBox}" 
       Text="{TemplateBinding Text}" /> 
     <ContentPresenter Visibility="{Binding ElementName=validableText, Path=(Validation.HasError), Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=True }" 
       Content="{Binding ElementName=validableText, Path=(Validation.Errors).CurrentItem}" 
       HorizontalAlignment="Left"> 
      <ContentPresenter.ContentTemplate> 
       <DataTemplate> 
        <Label Style="{StaticResource SectionEditErrorLabel}" Content="{Binding Path=ErrorContent}"/> 
       </DataTemplate> 
      </ContentPresenter.ContentTemplate> 
     </ContentPresenter> 
    </StackPanel> 
</ControlTemplate> 

나는 이런 식으로 링크 : 어떻게 든 파괴해야 바인딩 있도록

<TextBox Grid.Row="3" Grid.Column="1" MaxLength="200" Template="{StaticResource FormTextBox}" 
      Text="{Binding Email, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" /> 

불행히도, 어떤 유효성 검사를 수행하지 않습니다 ..

감사합니다. StackPanel 어쨌든 Grid의 직접적인 자식 없기 때문

답변

5

당신은

TemplateBinding

는 항상 템플릿 기반에 대한 그래서 Text 속성을 바인딩 OneWay이다, 템플릿 StackPanel에의 Grid.RowGrid.Column 바인딩이 필요하지 않습니다 TextBox은 업데이트되지 않습니다. 우리는 템플릿 기반 TextBox이 아닌 템플릿 내부의 TextBox에 유효성 검사를 수행 할 이후 RelativeSourceTwoWay

변경 ElementName=validableTextContentPresenter에 대한 바인딩에 RelativeSource={RelativeSource TemplatedParent}에있는 일반 바인딩으로 변경합니다. 보조 노트에

<ControlTemplate x:Key="FormTextBox" TargetType="{x:Type TextBox}"> 
    <StackPanel> 
     <TextBox x:Name="validableText" 
       MaxLength="{TemplateBinding MaxLength}" 
       Style="{StaticResource SectionEditPropertyTextBox}" 
       Text="{Binding RelativeSource={RelativeSource TemplatedParent}, 
           Path=Text, 
           Mode=TwoWay, 
           UpdateSourceTrigger=PropertyChanged}" /> 
     <ContentPresenter Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, 
               Path=(Validation.HasError), 
               Converter={StaticResource BooleanToVisibilityConverter} 
               ConverterParameter=True}" 
          Content="{Binding RelativeSource={RelativeSource TemplatedParent}, 
               Path=(Validation.Errors).CurrentItem}" 
          HorizontalAlignment="Left"> 
      <ContentPresenter.ContentTemplate> 
       <DataTemplate> 
        <Label Style="{StaticResource SectionEditErrorLabel}" Content="{Binding Path=ErrorContent}"/> 
       </DataTemplate> 
      </ContentPresenter.ContentTemplate> 
     </ContentPresenter> 
    </StackPanel> 
</ControlTemplate> 

, 당신이 여기있는 다른 대안은 한 XAML의 원래 조각으로 UserControl를 만드는 것입니다. 시나리오 (텍스트 등)에 필요한 종속성 속성을 소개 할 수 있습니다. 그것은 단지 작은 변화가 필요할 것입니다.

+0

정말 고마워요! 여러분의 코드와 마찬가지로 작은 경계선이 있습니다. adorner가 전체 stackpanel 주위에있을 것입니다. 그러나 바인딩이 어떻게 작동하는지 이해할 수 있었고 완벽하게 작동하는 데 유효 할 수있었습니다! – karlipoppins

관련 문제