我试图找到一种优雅的方法来验证WPF中的两个相关TextBox值。
每个文本框的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));
}
}
答案 0 :(得分:1)
好吧,一个简单的hackish方法就是为bigValue触发更改属性(这将导致刷新更大值的验证):
public decimal SmallerValue
{
get
{
return smallerValue;
}
set
{
bool fireForBigger = smallerValue > biggerValue && smallerValue < value;
smallerValue = value;
OnPropertyChanged("SmallerValue");
if (fireForBigger)
{
OnPropertyChanged("BiggerValue");
}
}
}
但是,一个更可靠的解决方案是创建自定义验证规则并自行设置: http://msdn.microsoft.com/en-us/library/system.windows.data.binding.validationrules.aspx