我已經在谷歌上搜索了所有內容,但仍在嘗試找到正確的答案。當我清除此文本欄位時,問題如下,系結值沒有被觸發。

所以,問題是如果這個文本欄位為空,它的有界值不會改變,但我的驗證規則確實檢測到它并發出警告。

在下面,您可以找到我的 XAML 片段、歸屬驗證規則和提到的屬性。
XAML 片段
<TextBox Style="{StaticResource TextBoxErrorStyle}" Margin="8 0 0 0" Visibility="{Binding AdditionalSurfaceTreatmentInfoVisibility, Converter={StaticResource BoolToVisConverter}}" FontSize="12" MaxLength="4" Width="40" Height="25"> <TextBox.Text> <Binding Path="AdditionalSurfaceTreatmentInfo" UpdateSourceTrigger="PropertyChanged" NotifyOnSourceUpdated="True" Mode="TwoWay" NotifyOnValidationError="True"> <Binding.ValidationRules> <classes:StandardValidationRule ValidatesOnTargetUpdated="True"/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>標準驗證規則:
public class StandardValidationRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var valueToValidate = value as string; if (string.IsNullOrEmpty(valueToValidate)) { return new ValidationResult(false, "Field is mandatory."); } return new ValidationResult(true, null); } }物業:
private string _additionalSurfaceTreatmentInfo; public string AdditionalSurfaceTreatmentInfo { get => _additionalSurfaceTreatmentInfo; set { _additionalSurfaceTreatmentInfo = value; OnPropertyChanged(); SetOrModifySurfaceTreatment(); Console.WriteLine(string.IsNullOrEmpty(_additionalSurfaceTreatmentInfo).ToString()); } }
預先感謝您的努力。任何幫助深表感謝!
上面的代碼確實可以按我的喜好作業。我已經嘗試了關于我可以在 ValidationRule 中填寫的不同屬性的所有內容。唯一需要更改的是,當文本框為空時,必須觸發 OnPropertyChanged() 方法。這樣,我可以稍后在提交保存命令時驗證屬性。
uj5u.com熱心網友回復:
使用 ValidationStep 屬性。例子:
<local:StandardValidationRule ValidationStep="UpdatedValue"
ValidatesOnTargetUpdated="True"/>
但是要驗證源屬性,需要更復雜的邏輯,因為驗證器接收的不是屬性的值,而是來自目標屬性的系結運算式。
public class StandardValidationRule : ValidationRule
{
private bool gettingValue = false;
private bool isValueReceived = false;
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (gettingValue)
{
isValueReceived = true;
return ValidationResult.ValidResult;
}
string? valueToValidate = value as string;
ValidationResult? result = null;
if (valueToValidate is null && value is not null)
{
if (value is BindingExpressionBase bindingExpression)
{
gettingValue = true;
isValueReceived = false;
DependencyObject target = bindingExpression.Target;
var gettingValueExpression = BindingOperations.SetBinding(target, SourceValueProperty, bindingExpression.ParentBindingBase);
if (!isValueReceived)
{
gettingValueExpression.UpdateTarget();
}
valueToValidate = target.GetValue(SourceValueProperty)?.ToString();
target.ClearValue(SourceValueProperty);
gettingValue = false;
}
else
{
result = unvalid;
}
}
if (result is null)
{
result = string.IsNullOrEmpty(valueToValidate)
? unvalid
: ValidationResult.ValidResult;
}
return result;
}
private static readonly ValidationResult unvalid = new ValidationResult(false, "Field is mandatory.");
// Using a DependencyProperty as the backing store for SourceValue. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SourceValueProperty =
DependencyProperty.RegisterAttached("SourceValue", typeof(object), typeof(StandardValidationRule), new PropertyMetadata(null));
}
還有另一種獲取源值的方法。
它基于internal通過反射使用方法。
許多人認為這是一種“壞”的方式。
但它的作業效率更高。
而且我認為不太可能有人會對internal已經在許多地方使用的方法進行更改。
public static class BindingExpressionHelper
{
private static readonly Func<BindingExpressionBase, DependencyObject, DependencyProperty, object> GetValueOfBindingExpression;
static BindingExpressionHelper()
{
Type beType = typeof(BindingExpressionBase);
var beMethod = beType
.GetMethod("GetValue", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, new Type[] { typeof(DependencyObject), typeof(DependencyProperty) })
?? throw new Exception("GetValue method not found.");
var beFunc = (Func<BindingExpressionBase, DependencyObject, DependencyProperty, object>)
beMethod.CreateDelegate(typeof(Func<BindingExpressionBase, DependencyObject, DependencyProperty, object>));
GetValueOfBindingExpression = beFunc;
}
/// <summary>Returns the source value of this binding expression.</summary>
/// <param name="bindingExpression">The binding expression whose value to get.</param>
/// <returns>The value of the binding expression received.</returns>
public static object? GetSourceValue(this BindingExpressionBase bindingExpression)
{
DependencyObject target = bindingExpression.Target;
DependencyProperty targetProperty = bindingExpression.TargetProperty;
var value = GetValueOfBindingExpression(bindingExpression, target, targetProperty);
return value;
}
}
public class StandardValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
string? valueToValidate = value as string;
ValidationResult? result = null;
if (valueToValidate is null && value is not null)
{
if (value is BindingExpressionBase bindingExpression)
{
valueToValidate = bindingExpression.GetSourceValue()?.ToString();
}
else
{
result = unvalid;
}
}
if (result is null)
{
result = string.IsNullOrEmpty(valueToValidate)
? unvalid
: ValidationResult.ValidResult;
}
return result;
}
private static readonly ValidationResult unvalid = new ValidationResult(false, "Field is mandatory.");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527030.html
上一篇:從另一個視窗獲取資料
