2017-12-12 1 views
0

CustomControlControlTemplate으로 둘러싸여 있습니다. CustomControl에는 TextBox의 경우 , TextBoxValidation.ErrorTemplate의 다른 CustomControl이 포함되어 있습니다.WPT에서 Validation.ErrorTemplate 내부에서 DataTrigger 바인딩하는 방법

내가하려는 것은 CustomControl을 가리거나 TextBox에 집중하면 Validation.ErrorTemplate이 나타납니다.

현재 주위에 Border을 입력 한 경우에만을 팝업합니다. 솔직하게 말해서 StackPanel 또는 AdornedElementPlaceholderBorder인지 확실하지 않습니다. DataTrigger 안에 Validation.ErrorTemplate을 바깥 쪽 BorderIsMouseOver 속성 또는 IsFocused 속성을 TextBox에 묶는 방법을 모릅니다. 코드 아래

지금까지 가지고 그 모든 가능한 경우

<ControlTemplate TargetType="{x:Type my:CustomControl}" x:Key="CustomTemplate"> 
<Border BorderBrush="Green" BorderThickness="1" x:Name="outerBorder"> 
    <my:LabelControl Label="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ViewModel.Label}"> 
     <TextBox HorizontalAlignment="Stretch" Padding="3 0 3 0" Foreground="{DynamicResource Control.Foreground}"> 
      <TextBox.Resources> 
       <Style TargetType="{x:Type Border}"> 
        <Setter Property="CornerRadius" Value="3"/> 
       </Style> 
      </TextBox.Resources> 
      <TextBox.Text> 
       <Binding Path="ViewModel.Value" UpdateSourceTrigger="PropertyChanged" RelativeSource="{RelativeSource TemplatedParent}" ValidatesOnDataErrors="True"/> 
      </TextBox.Text> 
      <TextBox.Style> 
       <Triggers> 
        ... 
       </Triggers> 
      </TextBox.Style> 
      <Validation.ErrorTemplate> 
       <ControlTemplate> 
        <StackPanel x:Name="BorderBorder"> 
         <Border BorderThickness="1" BorderBrush="Red" CornerRadius="3" HorizontalAlignment="Left" > 
          <AdornedElementPlaceholder x:Name="textBox"/> 
         </Border> 
         <Border Background="LightGoldenrodYellow" CornerRadius="3"> 
          <TextBlock Text="{Binding [0].ErrorContent}"/> 
          <Border.Style> 
           <Style> 
            <Setter Property="Border.Visibility" Value="Collapsed"></Setter> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding ElementName=BorderBorder, Path=IsMouseOver}" Value="true"> 
              <Setter Property="Border.Visibility" Value="Visible"></Setter> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </Border.Style> 
         </Border> 
        </StackPanel> 
       </ControlTemplate> 
      </Validation.ErrorTemplate> 
     </TextBox> 
    </my:LabelControl> 
</Border> 
</ControlTemplate> 

그래서 Validation.ErrorTemplate 내부 DataTriggerElementName=outerBorder에 바인딩해야합니다.

나는 문제가 나는 내부 ControlTemplate (Validation.ErrorTemplate)에 ControlTemplate 그래서 DataTriggerBindingControlTemplate 돌며을 가지고있다 외부의 Properties에 대한 지식이없는 것 같아요.

답변

1

당신은 컨트롤 자체의 IsMouseOver 속성에 TextBoxTag 속성을 결합하고 장식 요소의 DataTriggerTag 특성 바인딩 수 :

<ControlTemplate TargetType="{x:Type my:CustomControl}" x:Key="CustomTemplate"> 
    <Border BorderBrush="Green" BorderThickness="1" x:Name="outerBorder"> 
     <my:LabelControl Label="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ViewModel.Label}"> 
      <TextBox HorizontalAlignment="Stretch" Padding="3 0 3 0" Foreground="{DynamicResource Control.Foreground}" 
        Tag="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=my:CustomControl}}"> 
       <TextBox.Resources> 
        <Style TargetType="{x:Type Border}"> 
         <Setter Property="CornerRadius" Value="3"/> 
        </Style> 
       </TextBox.Resources> 
       <TextBox.Text> 
        <Binding Path="ViewModel.Value" UpdateSourceTrigger="PropertyChanged" RelativeSource="{RelativeSource TemplatedParent}" ValidatesOnDataErrors="True"/> 
       </TextBox.Text> 
       <Validation.ErrorTemplate> 
        <ControlTemplate> 
         <StackPanel x:Name="BorderBorder"> 
          <Border BorderThickness="1" BorderBrush="Red" CornerRadius="3" HorizontalAlignment="Left" > 
           <AdornedElementPlaceholder x:Name="textBox"/> 
          </Border> 
          <Border Background="LightGoldenrodYellow" CornerRadius="3"> 
           <TextBlock Text="{Binding [0].ErrorContent}"/> 
           <Border.Style> 
            <Style> 
             <Setter Property="Border.Visibility" Value="Collapsed"></Setter> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding AdornedElement.(TextBox.Tag), ElementName=textBox}" Value="True"> 
               <Setter Property="Border.Visibility" Value="Visible"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </Border.Style> 
          </Border> 
         </StackPanel> 
        </ControlTemplate> 
       </Validation.ErrorTemplate> 
      </TextBox> 
     </my:LabelControl> 
    </Border> 
</ControlTemplate> 
+0

woow 덕분에, 마치 마법처럼 일했다. .. 당신은'AdornedElement (TextBox.Tag)'조금 설명해 주시겠습니까? TextBox.IsFocused에 대해서도'DataTrigger'를 원할 때. 두 개의 'Tag'속성을 설정하거나 그 모양을 어떻게 설정할 수 있습니까? – SteveOhio

+1

하나의 태그 속성 만 있지만 TextBox의 속성에 바인딩 할 수 있습니다 (예 : 'AdornedElement. (TextBox.IsFocused)' – mm8

+0

그냥 시도 .. 잘 작동합니다! 감사합니다 – SteveOhio

관련 문제