C# 我如何处理DependencyProperty溢出情况?

C# 我如何处理DependencyProperty溢出情况?,c#,wpf,C#,Wpf,我有一个UserControl和一个名为Value的intdependencProperty。这被绑定到UserControl上的文本输入 public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(QuantityUpDown), new FrameworkPropertyMetadata(0, FrameworkProper

我有一个
UserControl
和一个名为Value的int
dependencProperty。这被绑定到
UserControl
上的文本输入

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(QuantityUpDown), new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged, CoerceValue));

public int Value
{
    get { return (int) GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

private static object CoerceValue(DependencyObject d, object basevalue)
{
    //Verifies value is not outside Minimum or Maximum
    QuantityUpDown upDown       = d as QuantityUpDown;
    if (upDown == null)
        return basevalue;

    if ((int)basevalue <= 0 && upDown.Instrument != null)
        return upDown.Minimum;

    //Stocks and ForEx can have values smaller than their lotsize (which is assigned to Minimum)
    if (upDown.Instrument != null && 
        upDown.Instrument.MasterInstrument.InstrumentType != Cbi.InstrumentType.Stock &&
        upDown.Instrument.MasterInstrument.InstrumentType != Cbi.InstrumentType.Forex)
        return Math.Max(Math.Min(upDown.Maximum, (int)basevalue), upDown.Minimum);

    if (upDown.Instrument == null)
        return Math.Max(Math.Min(upDown.Maximum, (int)basevalue), upDown.Minimum);

    if (upDown.Instrument.MasterInstrument.InstrumentType == Cbi.InstrumentType.Stock ||
        upDown.Instrument.MasterInstrument.InstrumentType == Cbi.InstrumentType.Forex)
        return Math.Min(upDown.Maximum, (int)basevalue);

    return basevalue;
}
public static readonly dependencProperty ValueProperty=dependencProperty.Register(“Value”、typeof(int)、typeof(QuantityUpDown)、new FrameworkPropertyMetadata(0,FrameworkPropertyMetadata options.bindstwoway默认值、OnValueChanged、强制值));
公共整数值
{
获取{return(int)GetValue(ValueProperty);}
set{SetValue(ValueProperty,value);}
}
私有静态对象强制值(DependencyObject d,object basevalue)
{
//验证值是否不在最小值或最大值之外
QuantityUpDown upDown=d作为QuantityUpDown;
if(upDown==null)
返回基值;

如果((int)basevalueA
int
属性不能设置为除
int
值以外的其他值。但是,文本框的文本属性类型是
string
,当运行时试图将
int
属性设置为不代表有效整数的
string
值时,会发生错误

您的dependency属性对此无能为力,因为它从未设置过。正如@@Ed Plunkett在其评论中建议的那样,您可以在值转换发生之前使用ValidationRule执行某些操作,并在转换失败时向用户显示错误消息:

public class StringToIntValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int i;
        if (int.TryParse(value.ToString(), out i))
            return new ValidationResult(true, null);

        return new ValidationResult(false, "Please enter a valid integer value.");
    }
}



有关WPF中数据验证的详细信息,请参阅以下博文:

一个
int
属性不能设置为
int
值以外的其他值。但是,文本框的文本属性的类型是
string
,当运行时试图设置
int时会发生错误e> 属性设置为不表示有效整数的
字符串

您的dependency属性对此无能为力,因为它从未设置过。正如@@Ed Plunkett在其评论中建议的那样,您可以在值转换发生之前使用ValidationRule执行某些操作,并在转换失败时向用户显示错误消息:

public class StringToIntValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int i;
        if (int.TryParse(value.ToString(), out i))
            return new ValidationResult(true, null);

        return new ValidationResult(false, "Please enter a valid integer value.");
    }
}



有关WPF中数据验证的详细信息,请参阅以下博文:

如果需要在绑定将值传递给源属性之前进行验证(即target==TextBox.Text,source==QuantityUpDown.value),您可以使用。属性的类型是
int
。因此,传递到强制方法中的值显然不能大于
int.MaxValue
@Clemens。但是用户可以输入大于int.MaxValue的值。我如何处理这种情况?如果在绑定将值传递到源代码之前需要进行验证ty(即target==TextBox.Text,source==QuantityUpDown.Value),您可以使用。属性的类型是
int
。因此,传递到强制方法中的值显然不能大于
int.MaxValue
@Clemens。但是用户可以输入大于int.MaxValue的值。我如何处理这种情况?有没有办法将其与
IDataErrorInfo
结合使用?我已经使用了这个cod但是,我还需要在VM中实现一些东西来处理此错误。我要做的是,检查ErrorCollection是否为空,然后确定是否启用/禁用了
RelayCommand
。是否有方法将此与
IDataErrorInfo
结合使用?我在视图中使用了此代码。但是,我还需要要在VM中实现一些东西来处理此错误,我要做的是检查ErrorCollection是否为空,然后确定是否启用/禁用了
RelayCommand