2017-01-09 95 views
0

我有一个UserControl和一个int DependencyProperty称为价值。这被绑定到UserControl上的文本输入。如何处理DependencyProperty溢出情况?

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; 
} 

如果用户输入大于int.MaxValue在文本框中的值,当该值进入CoerceValue,所述baseValue参数是1,如果我提供关于DependencyProperty验证值回调同样发生。

我想自己处理这种情况,例如将传入值设置为int.MaxValue。有没有办法做到这一点?

+0

如果您需要在绑定将值传递给源属性(即target == TextBox.Text,source == QuantityUpDown.Value)之前进行验证, ,你可以用[Binding.ValidationRules](h TTPS://msdn.microsoft.com/en-us/library/ms753962(V = vs.110)的.aspx)。 –

+1

属性的类型是'int'。因此传入Coerce方法的值不能大于“int.MaxValue”。 – Clemens

+0

@Clemens,显然。然而用户可以输入一个大于int.MaxValue的值。我该如何处理这种情况? – WasGoodDone

回答

1

A int属性永远不能设置为其他值而不是int值。然而,TextBox的Text属性的类型是string,并且当运行时尝试将int属性设置为不代表有效整数的string值时,会发生错误。

您的依赖项属性无法对此做太多的工作,因为它从不设置。作为@@埃德宾吉表明在他的评论,你可以使用一个有效性规则做一些价值转换发生之前和现在的错误信息给用户,如果转换失败:

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."); 
    } 
} 

<TextBox> 
    <TextBox.Text> 
     <Binding Path="Value" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <local:StringToIntValidationRule ValidationStep="RawProposedValue"/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

请参阅以下博客文章关于WPF中的数据验证以获取更多信息:https://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/