2013-01-31 12 views
6

odgałęzieniem this pytanie -WPF Validation ErrorTemplate dla klienta TextBox

Podczas mocowania szablonu błąd sprawdzania poprawności do mojego niestandardowego pola tekstowego tak -

<local:CustomTextBox CustomText="{Binding ViewModelProperty}" Validation.ErrorTemplate="{StaticResource errorTemplate}"/> 

<ControlTemplate x:Key="errorTemplate"> 
    <DockPanel> 
     <Border BorderBrush="Red" BorderThickness="1"> 
      <AdornedElementPlaceholder x:Name="controlWithError"/> 
     </Border> 
     <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0" MouseDown="Exclamation_MouseDown" Tag="{Binding AdornedElement.(Validation.Errors)[0].ErrorContent, ElementName=controlWithError}">!</TextBlock> 
    </DockPanel> 
</ControlTemplate> 

Jeśli nie było błędu walidacji w ViewModelProperty, moi aplikacja rzuca wyjątek -

Key cannot be null. 
Parameter name: key 

Nie jestem pewien, dlaczego tak się dzieje. Czy jest coś, co należy zrobić, aby przypisać nowy szablon błędu do niestandardowego formantu?

UPDATE:

Mam zorientowali się, że problem jest z właściwością zmiennych w szablonie błędu. Jeśli usuniemy tag, działa dobrze.

Dzięki

Odpowiedz

4

Dobrze więc sposób udało mi się rozwiązać ten problem był przez usunięcie słowa kluczowego AdornedElement i zmieniając szablon błędzie w następujący sposób:

<local:CustomTextBox CustomText="{Binding ViewModelProperty}"> 
    <Validation.ErrorTemplate> 
     <ControlTemplate> 
      <DockPanel> 
       <Border BorderBrush="Red" BorderThickness="1"> 
        <AdornedElementPlaceholder x:Name="controlWithError"/> 
       </Border> 
       <TextBlock Foreground="Red" FontSize="20" FontFamily="Segoe UI" Margin="3,0,0,0" MouseDown="Exclamation_MouseDown">!</TextBlock> 
      </DockPanel> 
     </ControlTemplate> 
    </Validation.ErrorTemplate> 
    <local:CustomTextBox.Style> 
     <Style TargetType="{x:Type local:CustomTextBox}"> 
      <Style.Triggers> 
       <Trigger Property="Validation.HasError" Value="true"> 
        <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/> 
        <Setter Property="Tag" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </local:CustomTextBox.Style> 
</local:CustomTextBox> 

Co ja nie rozumiem, dlaczego zachowuje się inaczej, gdy używasz słowa kluczowego AdornedElement, ale działa poprawnie podczas wiązania etykiety Tag/Tool za pomocą RelativeSource. Mimo że problem został rozwiązany, z zadowoleniem przyjmuję wszelkie pomysły, dlaczego tak się stało.

Dzięki

+3

Zdaję sobie sprawę, że jest to stara sprawa, ale zgaduję, że pierwszy przykład zwrócił wyjątek, ponieważ nie było żadnych błędów w 'kolekcji Validation.Errors', ale starali się wiązać właściwość "ErrorContent" pierwszego (nieistniejącego) błędu. W swoim rozwiązaniu opieramy się tylko na komunikacie o błędzie, gdy właściwość "HasError" była prawdziwa, a zatem, gdy wystąpił jeden lub więcej błędów w kolekcji. Nawet w tym drugim przykładzie powinieneś zobaczyć wyjątek wyświetlany w oknie Output programu Visual Studio. – Sheridan