限制datagrids单元格中的小数位数

时间:2014-03-19 12:10:19

标签: c# wpf wpfdatagrid

我有一个datagrid用户输入值。这是一栏:

<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个数字。所以我用这种方式制作了OFFSET属性:

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位数值。

如何解决这个问题?

1 个答案:

答案 0 :(得分: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,那么您可能会遇到UI未更新的问题 但是在.NET 4.5上它对我来说很好。