我正試圖找到一種優雅的方式來驗證WPF中的兩個相關的TextBox值。驗證WPF中的幾個鏈接的數據綁定文本框值
每個文本框的Text屬性都綁定到我的類上的公共小數屬性,該類實現了TwoWay綁定的INotifyPropertyChanged。
我要驗證的兩個值,使得:BiggerValue> = SmallerValue> = 0
我已經成功地得到各值以針對這些條件下,使用IDataErrorInfo的和字符串索引獨立地驗證。
我的問題如下:用戶打算減少這兩個值並以BiggerValue開頭,所以現在它小於SmallerValue。 BiggerValue TextBox上的驗證失敗(儘管該值已存儲)。然後用戶轉到SmallerValue並將其設置爲小於新的BiggerValue。現在這兩個值都是有效的,但我怎樣才能得到BiggerValue文本框自動反映它的(不變)值現在是有效的?
我應該在文本框中查看像LostFocus()這樣的事件處理程序,或者向屬性設置程序添加類似以下內容來強制刷新?
biggerValueTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
smallerValueTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
我的完整代碼如下。不知何故,這一切都讓人覺得這個簡單的問題很笨拙並且過於複雜。作爲WPF新手(這是第2天),對於我的方法的任何評論,無論激進,都會受到感謝。
XAML:
<TextBox x:Name="biggerValueTextBox"
Text="{Binding Path=BiggerValue,
Mode=TwoWay,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True}" />
<TextBox x:Name="smallerValueTextBox"
Text="{Binding Path=SmallerValue,
Mode=TwoWay,
ValidatesOnDataErrors=True,
ValidatesOnExceptions=True}" />
C#:
public partial class MyClass : UserControl,
INotifyPropertyChanged, IDataErrorInfo
{
// properties
private decimal biggerValue = 100;
public decimal BiggerValue
{
get
{
return biggerValue;
}
set
{
biggerValue = value;
OnPropertyChanged("BiggerValue");
}
}
private decimal smallerValue = 80;
public decimal SmallerValue
{
get
{
return smallerValue;
}
set
{
smallerValue = value;
OnPropertyChanged("SmallerValue");
}
}
// error handling
public string this[string propertyName]
{
get
{
if (propertyName == "BiggerValue")
{
if (BiggerValue < SmallerValue)
return "BiggerValue is less than SmallerValue.";
if (BiggerValue < 0)
return "BiggerValue is less than zero.";
}
if (propertyName == "SmallerValue")
{
if (BiggerValue < SmallerValue)
return "BiggerValue is less than SmallerValue.";
if (SmallerValue < 0)
return "SmallerValue is less than zero.";
}
return null;
}
}
// WPF doesn't use this property.
public string Error { get { return null; } }
// event handler for data binding
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
可能的重複[驗證規則使用來自另一個控件的值](http://stackoverflow.com/questions/18554019/validation-rules-using-value-from-另一個控制) – Dzyann 2015-12-15 12:15:52