2010-11-12 16 views
13

Neden hatalarla ilgili bir araç ipucu metni yok?WPF Doğrulama Hataları: Hata İletisiyle Araç İpucu Ayarlama

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <StackPanel> 
        <Border ...> 
         <AdornedElementPlaceholder ... 
          ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
        </Border> 
        ... 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Ben de

<AdornedElementPlaceholder ... 
    ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 

başarısız ama hatta aynı bağlama aşağıda suceeds, neden bu kadar olduğunu fark? AdornedElementPlaceholder metin kutusuna bakmıyor mu? Olmasa bile, bir araç ipucu bir yerde görünmemeli mi?

<Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
    </Trigger> 
</Style.Triggers> 

cevap

4

Sen AdornedElementPlaceholder bir ipucu koyamaz, ben sadece (sizin durumunuzda bir TextBox içinde) kullanır kim için yeri ayrılması oluyor, hiç görünür olduğunu sanmıyorum. Visual Tree'ye Snoop'la bakarak, TemplatedAdorner'ın VisualTree'de TextBox'tan farklı bir yerde bittiğini görebiliyoruz, böylece VisualBox'tan TextBox'u bulmamızın bir yolu olacak. Bunu, AdornedElement aracılığıyla bulabiliriz, ancak yine de bir ipucu ayarlayamayacağız.

alt text

TemplatedAdorner burada görünür tek şey Sınır olduğunu. Sınır, Çocuğunu bilir - TemplatedAdorner - ki bu da AdornedElement - TextBox'u bilir. Bu yüzden Sınır için Araç İpucu ayarlayabiliriz. (Ancak, bu Cilt Kenarlığı'na Tooltipin güncellemek için başarısız gibi görünüyor. Ben Snoop ile ve onu görüntüler bundan sonra bakmak zaman çalışır.)

<Border BorderBrush="Red" 
     BorderThickness="4" 
     ToolTip="{Binding RelativeSource={RelativeSource self}, 
        Path=Child.AdornedElement.(Validation.Errors)[0].ErrorContent}"> 

Yani, TextBox onun AttachedProperty Doğrulama nerede biz ErrorContent'ı bulmak için son örneğinizde yaptığınız gibi kendi Araç İpucu'nu ayarlamanız gerekir, aksi halde çalışmaz.

+2

Çözüm iyidir, ama ben senin araç ipucu bağlayıcı araç ipucu = "{Binding RelativeSource = {RelativeSource öz}, Yol = Child.AdornedElement yapmak istiyorum senin Output.Debug penceresinde özel durumları önlemek için. (Validation.Errors) .CurrentItem.ErrorContent} " – Dude0001

17

Geç kaldığımı biliyorum, ancak bu soruyu araştırırken bulduğum bir çözümü paylaşmama izin verin: WPF custom validator with tooltip. İçinde

bu ErrorTemplate yalnızca tam AdornedElement için ErrorContent ile Tooltip göstermektedir basit formudur.

<ControlTemplate x:Key="validationTemplate"> 
    <Grid Background="Transparent" 
      ToolTip="{Binding Path=/ErrorContent}"> 
     <AdornedElementPlaceholder /> 
    </Grid> 
</ControlTemplate> 

Ancak elbette istediğiniz gibi süsleyebilirsiniz. Sadece bir işaretleyici için Tooltip ile.

<ControlTemplate x:Key="validationTemplate"> 
    <Grid> 
     <Ellipse Fill="Red" Opacity="0.8" Width="10" Height="10" 
       HorizontalAlignment="Right" VerticalAlignment="Top" 
       ToolTip="{Binding Path=/ErrorContent}" /> 
     <AdornedElementPlaceholder /> 
    </Grid> 
</ControlTemplate> 

Resources bu Template koyun ve yapmanız gereken tüm Validation.ErrorTemplate ayarlıyor.

Validation.ErrorTemplate="{StaticResource validationTemplate}" 

Bu sinir bozucu Tetiklemeye artık gerek yok.

<Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
    </Trigger> 
</Style.Triggers> 
+1

Bu iyi bir fikir; Ne yazık ki ilk çözümünüz, kullanıcının tüm metin kutusu üzerine (şeffaf) bindirmesini engelleyerek kullanıcının odaklanmasını ve hatayı düzeltmesini engelleyecektir. – poke

+0

@poke Haklısınız. İlk çözüm sadece bir hata gösteren kontroller için kullanışlıdır. Ama belki ikinci çözüm istediğin şeydir. – LPL

+0

İkinci çözüm bir TextBox için iyi çalışıyor, ancak bir ComboBox için uygun değil. ToolTip'in çalışması için gerekli olan IsHitTestVisible öğesi true olarak ayarlanmışsa ComboBox'ı tıklayamıyorum. Düşüncesi olan var mı? –

İlgili konular