WPF CoerceCallback 取消值更改
Posted
技术标签:
【中文标题】WPF CoerceCallback 取消值更改【英文标题】:WPF CoerceCallback to cancel value change 【发布时间】:2020-09-09 10:58:36 【问题描述】:我有一个文本框数据绑定到 UpdateSourceTrigger = PropertyChanged 的字符串。我只想允许用户在文本框中输入整数。我还希望整数值最小为 0,最大为 60。
此代码仅适用于限制整数范围。经过一些测试后,我意识到如果我返回旧值,CoerceValueCallback 将不起作用。 Aka 我无法取消更改的属性。是否有某种方法可以更好地解决这种或其他类型的元数据?
我已尝试使用 DependencyProperty.UnsetValue 取消更改,如“使用 CoerceValue 取消值更改”中所述。这是行不通的。 https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/dependency-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();
【问题讨论】:
【参考方案1】:显然问题与使用文本框和 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;
```
【讨论】:
以上是关于WPF CoerceCallback 取消值更改的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 WPF DataGrid 在项目更新时取消选择 SelectedItem?
WPF 工具包 DatePicker 更改默认值“显示日历”