我有一个文本框数据绑定到一个字符串,UpdateSourceTrigger = PropertyChanged。我想只允许用户在文本框中输入整数。我还希望整数值最小为0,最大为60。
这段代码只在限制整数范围内工作。经过一些测试,我意识到如果我返回旧的值,CoerceValueCallback就不工作了。也就是我不能取消改变的属性。有没有什么方法可以解决这个问题,或者其他类型的元数据可以更好地工作?
我试过使用DependencyProperty.UnsetValue来取消更改,就像 "使用CoerceValue取消值更改 "中提到的那样。但没有成功。https:/docs.microsoft.comen-usdotnetframeworkwpfadvanceddependency-property-callbacks-and-validation。
public static object CoerceValueCallback(DependencyObject d, object value)
{
var uc = (UserControlConnection)d;
string s = (string)value;
if (int.TryParse(s, out int i))
{
i = Math.Min(i, 60);
i = Math.Max(i, 0);
uc.TimeoutSeconds = i;
}
return uc.TimeoutSeconds.ToString();
}
显然,问题与使用Textbox和UpdateSourceTrigger = PropertyChanged有关。下面的工作。
<TextBox Text="{Binding TimeoutSecondsString, ElementName=Parent_UC, UpdateSourceTrigger=Explicit}" TextChanged="Textbox_TextChanged"/>
private void Textbox_TextChanged(object sender, TextChangedEventArgs e)
{
var be = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty);
if (be != null)
{ be.UpdateSource(); }
}
public static object CoerceValueCallback(DependencyObject d, object value)
{
var uc = (UserControlConnection)d;
string s = (string)value;
if (int.TryParse(s, out int i))
{
i = Math.Min(i, 60);
i = Math.Max(i, 0);
uc.TimeoutSeconds = i;
return uc.TimeoutSeconds.ToString();
}
return DependencyProperty.UnsetValue;
}
```