2017-01-09 96 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/