benim WPF uygulamasında ValidationRules kullanmaya başladı ama oldukça karışık alıyorum güncellenir. aşağıdaki gibi ValidationRule BindingExpression ile gördü yerine değerini
class RequiredRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (String.IsNullOrWhiteSpace(value as string))
{
return new ValidationResult(false, "Must not be empty");
}
else
{
return new ValidationResult(true, null);
}
}
}
XAML Kullanılan:
<TextBox>
<TextBox.Text>
<Binding Path="Identity.Name">
<Binding.ValidationRules>
<validation:RequiredRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Bu çoğunlukla eser ben beklediğiniz gibi
Aşağıdaki basit kuralı var. Kaynak mülkümün (Identity.Name
) ayarlanmadığını görmek beni şaşırttı; Değişimi hiçbir zaman görmeyen bir geri alma işlevim var ve yeniden yazmanın dışında bir değeri geri döndürmenin bir yolu yok (iyi değil).
Microsoft'un Data Binding Overview çok iyi bu davranışı açıklar altına yakın doğrulama işlemini tarif etmektedir. Buna dayanarak, ValidationStep
UpdatedValue
olarak ayarlanmış olmasını isterim.
<validation:RequiredRule ValidationStep="UpdatedValue"/>
Bu, işlerin benim için tuhaf olduğu yer. Validate() nesne değeri ile ayarlanmış olan özellik değeri (yani bir dize) olarak adlandırılmak yerine, bir System.Windows.Data.BindingExpression
olsun! Microsoft'un bu davranışını açıklayan belgelerinde hiçbir şey görmüyorum.
Hata ayıklayıcıda, kaynak nesneyi (TextBox
'un DataContext
) görebiliyor, özellik yoluna gidip değerin ayarlandığını görebiliyorum. Bununla birlikte, doğrulama kuralı içinde doğru mülke ulaşmak için iyi bir yol göremiyorum.
Not: ValidationStep
ConvertedProposedValue
ile girilen dizeyi (kullanmış olduğum bir dönüştürücüm yok) elde ediyorum, ancak beklendiği gibi doğrulama başarısız olduğunda kaynak özellik güncelleştirmesini de engeller. CommittedValue
ile, dize yerine BindingExpression
olsun. pek çok soru var burada
şunlardır:
Neden ValidationStep ayarına göre doğrula geçirilen tutarsız bir argüman türü() alabilirim?
Ben BindingExpression gelen gerçek değeri nasıl alabilirim?
Alternatif olarak, kullanıcı önceki (geçerli) durumuna TextBox dönmek için izin vermek için iyi bir yol var? (Ben de belirtildiği gibi, kendi geri alma fonksiyonu değişikliğini hiç görmez.)
Herhangi bir geri bildirim göremedim, özellikle de bu durumdan beri. Bana göre bu, aksi takdirde oldukça mükemmel ve sezgisel görünüyor ValidationRule yaklaşımını kullanarak bir gösterici gibi görünüyor. Karşılaştırmada tıknaz gibi görünse de, IDataErrorInfo kullanmak daha mı iyi? – mbmcavoy