WPF依赖属性问题

E次奥 2014-12-02 05:56:35

我在WPF设置了个double类型的依赖属性,然后XAML中设置UpdateSourceTrigger=PropertyChanged,

程序运行后给这个依赖属性赋值,发现没法输入小数点?

怎么解决,求大神帮忙。
...全文
190 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
csjtxy 2014-12-03
  • 打赏
  • 举报
回复
其实,都没有问题,或者说问题不是存在于依赖项属性。

<TextBox Width="200" Height="28" Text="{Binding TestNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
这个绑定中,有没有UpdateSourceTrigger,现象是完全不一样的。 原因就在于: 1. 如果没有UpdateSourceTrigger,输什么都可以输,包括特殊字符,在此控件失去焦点的时候,.Net会去进行数据验证,如果发现输入不是有效的数据,比如上面的控件,就会去验证是不是有效的double型数据。如果不是,控件周围会出现红色框框,表示输入有误; 如果有UpdateSourceTrigger,那就不再是失去焦点再进行数据验证了,而是每输一个字符就验证一下,即TextChanged就会验证。 那么,“0.“转换为有效的double型数据,自然就是0,一输入小数点,就被转换转没了。所以你认为没输入。 具体解决方案,那就得自定义控件了。必要时,还得自定义数据验证方式。
exception92 2014-12-03
  • 打赏
  • 举报
回复
贴出cs代码
E次奥 2014-12-03
  • 打赏
  • 举报
回复
引用 1 楼 qldsrx 的回复:
把输入法关闭试试
不行啊
於黾 2014-12-03
  • 打赏
  • 举报
回复
改为UpdateSourceTrigger=PropertyChanged 没有任何意义,反而会在输入过程中频繁的去更改属性值
qldsrx 2014-12-03
  • 打赏
  • 举报
回复
TextBox .Text 属性的默认 UpdateSourceTrigger 值为 LostFocus。 这意味着如果应用程序的 TextBox 包含数据绑定 TextBox.Text 属性,则直到 TextBox 失去焦点(例如,将鼠标移到 TextBox 外单击时),键入到 TextBox 中的文本才能更新源。你为啥要修改为PropertyChanged呢?
E次奥 2014-12-03
  • 打赏
  • 举报
回复
引用 9 楼 csjtxy 的回复:
恩,也就是说,诸如Width=“*”这种情况,宽度是没有值的,即值是System.Double.NaN。
那自定义的double依赖属性怎么在运行后输入值,难道只能输入整数
csjtxy 2014-12-03
  • 打赏
  • 举报
回复
恩,也就是说,诸如Width=“*”这种情况,宽度是没有值的,即值是System.Double.NaN。
exception92 2014-12-03
  • 打赏
  • 举报
回复
exception92 2014-12-03
  • 打赏
  • 举报
回复
引用 5 楼 csjtxy 的回复:
其实,都没有问题,或者说问题不是存在于依赖项属性。

<TextBox Width="200" Height="28" Text="{Binding TestNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

这个绑定中,有没有UpdateSourceTrigger,现象是完全不一样的。
原因就在于:
1. 如果没有UpdateSourceTrigger,输什么都可以输,包括特殊字符,在此控件失去焦点的时候,.Net会去进行数据验证,如果发现输入不是有效的数据,比如上面的控件,就会去验证是不是有效的double型数据。如果不是,控件周围会出现红色框框,表示输入有误;
如果有UpdateSourceTrigger,那就不再是失去焦点再进行数据验证了,而是每输一个字符就验证一下,即TextChanged就会验证。
那么,“0.“转换为有效的double型数据,自然就是0,一输入小数点,就被转换转没了。所以你认为没输入。

具体解决方案,那就得自定义控件了。必要时,还得自定义数据验证方式。


引用 6 楼 porenasckx 的回复:
[quote=引用 4 楼 duanzi_peng 的回复:]
贴出cs代码


   <Button x:Name="Btn" Content="Button" HorizontalAlignment="Left" Margin="412,341,0,0" VerticalAlignment="Top" Width="75"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="397,416,0,0" TextWrapping="Wrap" Text="{Binding ElementName=Btn,Path=Width,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>


我刚试了,在vs2010没问题,但是到2012就不行了?[/quote]
5楼说的有道理。于是我就查看了width的”从元数据“信息,发现其值必须大于0.0,任何转变不成double的都将视为System.Double.NaN类型。
E次奥 2014-12-03
  • 打赏
  • 举报
回复
引用 4 楼 duanzi_peng 的回复:
贴出cs代码
   <Button x:Name="Btn" Content="Button" HorizontalAlignment="Left" Margin="412,341,0,0" VerticalAlignment="Top" Width="75"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="397,416,0,0" TextWrapping="Wrap" Text="{Binding ElementName=Btn,Path=Width,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>
我刚试了,在vs2010没问题,但是到2012就不行了?
风的期待 2014-12-02
  • 打赏
  • 举报
回复
我只是路过的,希望能多学东西!
qldsrx 2014-12-02
  • 打赏
  • 举报
回复
把输入法关闭试试

110,533

社区成员

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

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

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