2016-04-04 16 views
0

Xceed WPF Toolkit'ten iki DateTimePickers alıyorum ve MahApps Metro kullanın, doğrulama hata şablonu default one provided by Metro ({DynamicResource ValidationErrorTemplate}) 'dir. doğrulama ile ele alınır doğrulama böyle bağlıyor:Validation.ErrorTemplate yalnızca en az bir kez hata göründüğünde görünür

[TimeSpanValidator] 
public TimeSpan StartTime 
{ 
    get { ... } 
    set { ... } 
} 

[TimeSpanValidator] 
public TimeSpan EndTime 
{ 
    get { ... } 
    set { ... } 
} 

başvurulan doğrulayıcı sınıfı: Bu ince sürece pencereyi açarken bir hata yok gibi çalışır

public class TimeSpanValidator : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     EditEntryViewModel viewmodel = validationContext.ObjectInstance as EditEntryViewModel; 
     if (viewmodel == null) 
     { 
      Debug.Fail("Error in validation: ViewModel was not assigned."); 
      return ValidationResult.Success; 
     } 
     if (!viewmodel.ValidTimeSpan) 
      return new ValidationResult("End time must not be earlier than start time."); 
     if (!viewmodel.TimeSpanUnoccupied) 
      return new ValidationResult("The timespan overlaps with an existing entry."); 
     return ValidationResult.Success; 
    } 
} 

. Ama zaten sahip olduğum zaman (benim durumumda, önceden doldurulmuş zamanlar varolan biriyle çakışan bir zaman aralığı oluşturur) hata şablonu hiç gösterilmiyor, en azından değerinden başka bir geçersiz değere geçtiğimde bile geçerli bir kez.

Hata ayıklayıcısını kullanarak doğrulayıcıya adım attım, bir hata olduğunda her zaman geçersiz bir sonuç döndürüyor. Ayrıca, değerler geçersiz olduğunda iletişim kutusunu kapatamıyorum, ValidTimeSpan ve TimeSpanUnoccupied doğru çalışıyor. Yani gerçekten sadece yanlış giden hata şablonunun görüntülenmesi. Ve neden hiç bir fikrim yok. Ayrıca, bu yalnızca hata şablonuyla oluşur. Ben Validation.HasError bir ipucu bağladığınızda amaçlanan gibi ipucu, hata zaten var olsa bile penceresi açıldığında gösterir: Neyi yanlış yapıyorum

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

? Bir şey mi kaçırdım?

cevap

0

Minimal, Complete, and Verifiable code example iyi bir sorun olmaksızın, sorunu güvenilir şekilde yeniden üretir, sorunun gerçekte ne olduğundan emin olmanız imkansızdır. Dedi ki ...

Benzer problemlere kendim rastladım. Özellikle, hedef özellik değiştiğinde ve kaynağa yeniden kopyalandığında doğrulama işleminin yalnızca ortaya çıktığı anlaşılmaktadır. Bu, denetim ilk başlatıldığında gerçekleşmez ve bu nedenle doğrulama adımı oluşmaz.

Bu özel sorunla ilgili bir çalışmanın, denetim yüklendikten sonra BindingExpression.UpdateSource() yöntemini çağırarak doğrulamayı zorlamak olduğunu buldum. Yani Loaded olayı için bir işleyici ekleyin ve buradaki yöntemi arayın. Örneğin:

private void textBox1_Loaded(object sender, RoutedEventArgs e) 
{ 
    TextBox textBox = (TextBox)sender; 

    BindingOperations.GetBindingExpression(textBox, TextBox.TextProperty).UpdateSource(); 
} 

yukarıdaki aslında sorununuzu gidermez ise güvenilir sorunu yeniden üreten bir iyi MCVE sağlayarak sorunuzu geliştirmek ediniz. Alternatif olarak, şu soruya bakın: Initial validation on dynamically added control. Bu soruda, doğrulama kendisinin sorunu değil, başarısız doğrulama ile ilgili kullanıcı geri bildirimi sağlayan reklamveren güncellenmesidir. Sorunuzda sorunun tam olarak nerede olduğunu söyleyebilmem için yeterli bilgi yok, ama umarım bu cevaplardan biri ya da diğeri yardımcı olacaktır.

İlgili konular