2014-03-19 29 views
0

我有一个datagrid用户输入值。这里是一列:限制datagrids单元格中的小数位数

<datagrid:ThemedDataGrid AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="True" ItemsSource="{Binding Model.ItemCollection, UpdateSourceTrigger=PropertyChanged}" 
          SelectionUnit="FullRow" 
          SelectedItem="{Binding Model.SelectedItem}" > 
        <datagrid:ThemedDataGrid.Columns > 
         <datagrideditors:DataGridDoubleColumn Binding="{Binding OFFSET, UpdateSourceTrigger=PropertyChanged}" Header="{DynamicResource Offset}" /> 
        </datagrid:ThemedDataGrid.Columns> 
    </datagrid:ThemedDataGrid> 

我需要允许用户只输入小数部分的5个数字。所以我制作的特性抵消这种方式:

public new double OFFSET 
{ 
    get { return _offset; } 
    set 
    { 
     int count = 0; 
     bool isSeparator = false; 
     char a = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 
     var formatted = value.ToString().ToCharArray(); 
     foreach (var y in formatted) 
     { 
      if (!isSeparator) 
      { 
       if (y == a) 
       { 
        isSeparator = true; 
       } 
      } 
      else 
      { 
       count++; 
      } 
     } 
     if (isSeparator) 
     { 
      if (count > 5) 
      { 
       return; 
      } 
     } 
     _offset = value; 
     OnPropertyChanged(); 
     } 
    } 

不允许用户在小数部分进入第六位,在这里,他希望用户可以输入尽可能多的数字,只有当他输入的值,小数值以小数部分的5位数字更改为值。

如何解决这个问题?

回答

0

我得到的英语可能是第二语言,但是这是不明确

不允许用户在小数部分进入第六位,当他想 这里用户可以输入尽可能多的数字,只有当他输入值 时,小数值将更改为 小数部分中的5位数值。

考虑

if (count > 5) { return; } 

你在DataGrid
您需要分配到_offset正确的值,并调用OnPropertyChanged()什么都不做的价值;

例如

if (count > 5) 
{ 
    _offset = 5.55555; 
    // I leave it to you to properly assign _offset; 
    OnPropertyChanged(); 
    return; 
} 

    StringBuilder() sb = new StringBuilder(); 
    foreach (var y in formatted) 
    { 

     if (!isSeparator) 
     { 
      if (y == a) 
      { 
       isSeparator = true; 
      } 
     } 
     else 
     { 
      count++; 
      if (count > 5) break; 
     } 
     sb.Append(y); 
    } 
    if (isSeparator) 
    { 
     if (count > 5) 
     { 
      _offset = Double.Parse(sb.ToString()); 
      OnPropertyChanged(); 
      return; 
     } 
    } 

而如果你是在.NET 3.5或4.0,那么你可能会与用户界面没有更新的问题。
但在.NET 4.5上,它对我来说工作正常。

+0

对不起,我的英语。当第六位数字在逗号后输入时,我想删除它,所以逗号后总是只有5位数 – Sasha

+0

我回答了你的问题。为_offset指定一个值,后面只有5位数字。并调用OnPropertyChanged(); – Paparazzi

+0

这不是我想要的。我希望第六位数字在输入后被删除。这就是为什么我有if(count> 5){return; } - 所以五位数的旧值不会被改变。并且,如果您建议,我可以输入10或20位数字,该值将在CellEditEnding事件后格式化 – Sasha