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 更改默认值“显示日历”

WPF:当某个值更改时重新应用 DataTemplateSelector

WPF 更改(覆盖)所有控件中的突出显示和边框颜色

WPF:在运行时更改配置文件用户设置?

通过取消引用更改 NSArray 中的值?