【问题标题】:Converter Doesn't want to work in only one situation转换器不想只在一种情况下工作
【发布时间】:2015-10-10 00:03:49
【问题描述】:

我创建了 Coverter,它作为 TextBoxes 的仅数字验证。 一切都很好,我在几个地方使用它,但有一个地方它不起作用,我调试了它,它在一开始就可以工作,就像它是 OneTime 模式一样。

转换器:

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var val = value.ToString();
        return (string.IsNullOrEmpty(val) ? "" : ( (val.Substring(val.Length - 1).Equals(",") && val.Count(x => x == ',') < 2) || char.IsDigit(System.Convert.ToChar(val.Substring(val.Length - 1))) ? val : val.Substring(0,val.Length-1)));
    }

我不知道这是否重要,但一次在 Window 中使用,第二次在 Page 中使用,但在 Page 中不起作用。 页面:

                <TextBox Name="PeselTextBox"
                Margin="2,5"
                Width="70"
                VerticalAlignment="Center"
                Text="{Binding ElementName=PeselTextBox,
                               Path=Text,
                               Mode=OneWay,
                               UpdateSourceTrigger=PropertyChanged,
                               Converter={StaticResource NumberValidationConverter}}"/>

在 Window 中也是一样的。 试图寻找解决方案,但我就是不明白这个错误。

【问题讨论】:

  • 附带说明:您的验证至少在以下两种情况下不起作用:复制和粘贴移动在实际输入之前插入插入符号 - 并不假定它始终保留在 TextBox 的末尾。我已经在 Window 中尝试过您的代码并且 Binding 有效(不仅仅是一次),所以听到它不适用于 Page 很奇怪。
  • Binding 指的是定义元素本身。为什么?
  • @KingKing 它实际上可以在其他页面中使用,只是在这个页面中没有。

标签: c# wpf


【解决方案1】:

首先,不要使用转换器进行验证。这不是他们的目的或擅长的。如果需要验证,请查看Using IDataErrorInfo in M-V-VM

也就是说,您正在使用模式OneWay。这意味着绑定所做的唯一事情就是反映视图模型中的更改(通过PropertyChanged),无论如何不应该需要验证!如果您想在对视图模型应用更改之前进行转换,请使用ConvertBack 方法和模式TwoWayOneWayToSource

【讨论】:

  • 我知道应该用 IDataError 来完成,但我还在学习 MVVM,而且这个项目还在代码后面,所以这里没有任何视图模型。但我想让一些验证比 textChanged 事件更好
  • @Zeronader 好吧,那么您显然正在使用您的代码隐藏作为视图模型(或者您的绑定根本不起作用)。无论如何,最好现在就开始良好的实践!拥有合适的视图模型将有助于使未来的工作更轻松。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2015-05-03
相关资源
最近更新 更多