有关WPF依赖属性验证的问题

亲爱的大狗 2014-03-08 08:58:57
自己写了一个小Demo,遇到了一些问题.搞不明白,希望能在这里得到解答.
这是我的demo结构


这是依赖属性的全部实现:
        public string MyObserver
{
get { return (string)GetValue(MyObserverProperty); }
set { SetValue(MyObserverProperty, value); }
}

static FrameworkPropertyMetadata myPropertyMetadata = new FrameworkPropertyMetadata("default hello", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, PropertyChangedCallback, CoerceValueCallback, false, UpdateSourceTrigger.PropertyChanged);

private static object CoerceValueCallback(DependencyObject d, object baseValue)
{
MessageBox.Show("I am forced to do this. and the baseValue is :" + baseValue.ToString());
return baseValue+"~~~";
}

private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show("I am going to tell you the propertyChanged \r\ne.OldValue is: "+e.OldValue+"\r\ne.NewValue is: "+e.NewValue);
}

// Using a DependencyProperty as the backing store for MyObserver. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyObserverProperty =
DependencyProperty.Register("MyObserver", typeof(string), typeof(MyObserverControl), myPropertyMetadata,ValidateValueCallback);

private static bool ValidateValueCallback(object value)
{
string input = value as string;
foreach (char item in input)
{
if (item=='A')
{
MessageBox.Show("I am going to validate your inputs not containing letter \"A\". and now i am returning False");
return false;
}
}
MessageBox.Show("I am going to validate your inputs not containing letter \"A\". and now i am returning True");
return true;
}


前台绑定的代码
        <TextBox Grid.Row="0" Text="{Binding ElementName=uc_MyObserver,Path=MyObserver,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Height="40" Width="400"></TextBox>
<local:MyObserverControl x:Name="uc_MyObserver" Grid.Row="1"/>



问题就来了,如果我去掉ValidateValueCallback() 一切正常

.当改动值时,能够正常跳出Messbox通知.
可是如果我在Register中添加了ValidateValueCallback(),绑定就失效了,改动textbox也不会触发CoerceValueCallback()了.只有初始化的时候会跳两个
MessageBox.Show("I am going to validate your inputs not containing letter \"A\". and now i am returning True");


请问是什么原因?添加了ValidateValueCallback()和不添加的区别在哪里?希望能给个解决办法!谢谢了~
...全文
242 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
亲爱的大狗 2014-03-10
  • 打赏
  • 举报
回复
引用 4 楼 q107770540 的回复:
http://www.cnblogs.com/mgen/archive/2012/01/03/2311206.html
我看过这个帖子,我也照着做过.没有问题.不加ValidateValueCallback()委托的时候,执行顺序也是正确的.加了以后那个TextBox和TextBlock之间的绑定好像就断了,CoerceValueCallback也不会执行了.
亲爱的大狗 2014-03-10
  • 打赏
  • 举报
回复
有没有帮忙解答一下.
亲爱的大狗 2014-03-10
  • 打赏
  • 举报
回复
顶下 要到6个字符

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧