WPF CoerceCallback取消值的变化。

问题描述 投票:0回答:1

我有一个文本框数据绑定到一个字符串,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();
        }
c# wpf callback dependency-properties
1个回答
0
投票

显然,问题与使用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;
}
```
© www.soinside.com 2019 - 2024. All rights reserved.