【问题标题】:WPF:Binding to not nullable values while validatingWPF:验证时绑定到不可为空的值
【发布时间】:2011-06-08 12:35:11
【问题描述】:

考虑以下场景:

<TextBox Text="{Binding Price}"/>

这是价格属性

public Decimal Price
    {
        get
        {
            return _Price;
        }
        set
        {
            if (_Price != value)
            {
                _Price = value;
                OnPropertyChanged("Price");
            }
        }
    }

此方法检查我的财产

private string validateGlassPrice()  
  {    
    if (GlassPrice <= 0)   
     {       
     return "price can't be 0 nor a minus value "; 
     } 
   else 
     {           
     return String.Empty;    
     }  
  }

此方法检查我的属性是否为 0 或更小 - 一个负值 - 现在我需要检查它是 null 还是空,问题是 Decimal 不接受可为空的值,有什么解决方法吗?

提前致谢

【问题讨论】:

    标签: .net wpf data-binding mvvm


    【解决方案1】:

    您可以使用Nullable Type

    或者,如果不希望更改模型,则改为绑定到视图模型上的属性。

    通常,我更喜欢在视图模型中使用字符串值作为双精度/十进制值,并将验证放在视图模型属性的设置器中。如果传递了无效的小数,请不要更新支持字段。

    在适当的时候,将有效视图模型的属性值复制到您的模型中,例如在模型需要持久化之前等,或者在屏幕关闭时。

    【讨论】:

    • 感谢您的回答,但是将 Decimal 更改为任何其他类型会导致我进行大量返工,它是 Decimal 因为我的实体框架如此决定,任何解决方法都会为我节省很多时间,我真的需要
    • 为什么需要针对空值进行验证?您是否将 Price 属性直接绑定到 TextBox?
    • 是的,我将绑定直接绑定到文本框,请参阅上面的 XAML
    【解决方案2】:

    我不会使用验证函数,而是使用DataAnnotations。您可以创建自定义ValidationAttributes。还可以查看this Stackoverflow post 中的 IDataErrorInfo。您可以在操作中处理输入错误以禁用它们,就像使用 ICommand 框架一样。

    【讨论】:

    • 我正在使用 IDataErrorInfo ,在没有 Decimal 值的其他 Windows 中一切都很好,我必须坚持这种类型的实现,因为我不想重做已经完成的工作并且工作正常的 WPF 窗口
    • 我只是这么说,但如果你不想重写东西,那么你可以实现的答案并不多。我的或 devdigital 的解决方案都很好,但您必须进行最少的修改才能使其正常工作。我知道您不想要侵入性解决方案,但通常没有简单的方法来做到这一点。
    【解决方案3】:

    我使用 devdigital 更新的解决方案,另一个字符串属性

    public String PriceString
        {
            get
            {
                return _PriceString;
            }
            set
            {
                Decimal result;
    
    
    
    
                if (Decimal.TryParse(value, out result))
                {
                    _PriceString = value;
                    GlassPrice = result;
    
                }
                else
                {
                    GlassPrice = -33322;
                    _PriceString = value;
                }
                OnPropertyChanged("PriceString");
            }
        }
    

    当文本框实际上是空白时,我将 GlassPrice 设置为 -33322,我只是使用它来区分零值或负值。除了 -33322 本身之外。

    【讨论】:

    • 不要使用幻数。使用可空的decimal? 类型。这就是它的用途。将GlassPrice 设为decimal?,如果输入的值无效,则将其设置为null
    • 好吧,因为我不想重新编辑自动生成的 - 由我的 Entity-Framework - DAL 类,我必须保留 GlassPrice Decimal
    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2019-06-17
    • 1970-01-01
    相关资源
    最近更新 更多