2013-02-19 23 views
6

WPF hata şablonunun WPF içinde bir UserControl içindeki bir denetimde görünmesini nasıl sağlarsınız?WPF içinde bir UserControl içindeki Denetimlerdeki Doğrulama Hatası Şablonunu Göster

İki Etiket, iki Metin Kutusu ve bir CheckBox içeren bir UserControl var. TextBox'lardan biri varlığın adını temsil eder ve benim Window'umun DataContext'i olan ViewModel'ım tarafından oluşturulan Model özelliğindeki bir Name özelliğine bağlıdır. Model sınıfı, IDataErrorInfo arabirimini uygular ve Birim Sınaması aracılığıyla, İsim boş olduğunda, özellik indeksleyici uygulaması aracılığıyla bir hata döndürüldüğünü doğruladım. UserControl'ümdeki Name TextBox'ı destekleyen Bağımlılık Özelliği'ne bağlı kaldım ve doğrulama hatasıyla karşılaşıldığında, WPF hata şablonu yalnızca Name TextBox yerine tüm UserControl etrafında kırmızı bir kenarlık yerleştiriyor.

UserControl'ün ad alanına bağlanma aşağıdaki gibidir. aşağıdaki gibi

<vc:MyUserControl ItemName="{Binding Model.Name, ValidatesOnDataErrors=True}" /> 

benim UserControl bir simiplified sürümü ve destek DependencyProperty olduğunu.

<UserControl> 
    <Grid> 
     <TextBox Text="{Binding ItemName}" /> 
    </Grid> 
</UserControl> 

public partial class MyUserControl: UserControl 
{ 
    public static readonly DependencyProperty ItemNameProperty = 
     DependencyProperty.Register(
      "ItemName", 
      typeof(string), 
      typeof(MyUserControl), 
      new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) 
    ); 

    public string ItemName 
    { 
     get { return (string)GetValue(ItemNameProperty); } 
     set { SetValue(ItemNameProperty, value); } 
    } 
} 

Ben şimdiye kadar bütün Silverlight açısından olmuştur bu konuya ilişkin ya da (bana mantıklı gelmedi) kırmızı sınır göstermeyen için bir dönüştürücü kullanarak bulduk bilgiler. Bu bilginin hepsi burada stackoverflow üzerinde bulundu.

Bu sorunu WPF ile çözebilecek biri var mı? Açık bir şey mi görüyorum? UserControl için

+0

İlgili soru [burada] (http://stackoverflow.com/q/7808986/620360) ve [burada] (http://stackoverflow.com/q/1198342/620360) – LPL

+0

sayesinde, LPL. Bu konuda yaptığım araştırmalarda her iki soruyu da görmüştüm. İkinci linkte kabul edilen cevap, benim sorularımda bahsettiğim dönüştürücünün kullanımıdır. Bu benim için çok yanlış görünüyor. İlk sorudaki kabul edilen cevap benim için de işe yaramıyordu. – CoderDawson

cevap

9

ErrorTemplate sizin UserControl kullanım ValidatesOnDataErrors=True için bağlamaları halinde kullanılacaktır. Ancak kırmızı kenarlığı Validation.ErrorTemplate Attached Property ile kaldırabilirsiniz. içinde

Tüm kontroller senin UserControl siz de destek DependencyProperties için IDataErrorInfo uygulayarak onların bağlantıları doğrulamak yalnızca kırmızı bir sınır gösterecektir.

public class MyUserControl : UserControl, IDataErrorInfo 
{ 
    public static readonly DependencyProperty ItemNameProperty = 
     DependencyProperty.Register(
      "ItemName", 
      typeof(string), 
      typeof(MyUserControl), 
      new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) 
    ); 

    public string ItemName 
    { 
     get { return (string)GetValue(ItemNameProperty); } 
     set { SetValue(ItemNameProperty, value); } 
    } 

    public string Error 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
     // use a specific validation or ask for UserControl Validation Error 
     return Validation.GetHasError(this) ? "UserControl has Error" : null; 
     } 
    } 
} 

ve burada basitleştirilmiş XAML

<UserControl Validation.ErrorTemplate="{x:Null}"> 
    <Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"> 
     <TextBox Text="{Binding ItemName, ValidatesOnDataErrors=True}" /> 
    </Grid> 
</UserControl> 

ilavesi

size DependencyProperty için BindingExpression almak ve HasError Property kontrol edebilirsiniz hatalar arasında ayrım yapmak istiyorsanız

.

BindingExpression be = BindingOperations.GetBindingExpression(this, ItemNameProperty); 
return be != null && be.HasError ? "ItemName has Error" : null; 
+0

Tekrar teşekkürler LPL. Başlangıçta benzer bir değişiklik girişiminde bulunmuştum ancak UserBox denetiminde hangi TextBox'ların Valide'nin kendisinde her zaman yanlış döndürülen Validation.GetHasError çağrısı olarak bir hata yaptığını belirleyemedim. UserControl içinde iki TextBoxes ile hangi kutunun aslında bir hata olduğunu belirlemek için var mı? – CoderDawson

+0

Daha önce yanlış yaptığımdan emin değilim ama bu benim için çalışıyor gibi görünüyor. Benzersiz TextBox'lardaki hatalar arasında nasıl ayrım yapılacağını hala göremiyorum, ancak bu noktada sadece bir tanesinde bir doğrulama yapacağım. Teşekkürler, LPL! – CoderDawson

+1

Hatalar arasında ayırım yapmak için bir öneri ekledim. ;) – LPL

İlgili konular