WPF Datagrid DataGridTextColumn不允许小数

时间:2014-07-08 09:16:01

标签: wpf wpfdatagrid wpftoolkit wpf-4.0

我无法在DataGridTextColumn中输入小数值。以下链接表明,如果UpdateSourceTrigger = PropertyChanged,我们无法输入小数值。

WPF DataGridTextColumn binding doesn't accept decimals

但我的要求是我必须保留UpdateSourceTrigger = PropertyChanged。

请建议。

以下是我的Datagrid的代码段:

  <DataGrid x:Name="MyDataGrid" HorizontalAlignment="Left" CanUserResizeColumns="True" VerticalAlignment="Stretch" ItemsSource="{Binding MyDataCollectionListView, Mode=TwoWay}"
      SelectionMode="Extended" IsSynchronizedWithCurrentItem="True" SelectionUnit="Cell">                                                      
     <DataGrid.Columns>
      <DataGridTextColumn x:Name="ColMyDataGrid" Header="Price" Binding="{Binding Path=Price, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, Converter={StaticResource    ZeroToEmptyConverter}}" >
  <DataGridTextColumn.ElementStyle>
    <Style TargetType="TextBlock">
      <Setter Property="TextAlignment" Value="Right" />                                               
       <Setter Property="Background" Value="#BEFAC4"/>   
    </Style>
  </DataGridTextColumn.ElementStyle>
 </DataGridTextColumn>
</DataGrid.Columns>

2 个答案:

答案 0 :(得分:0)

UpdateSourceTrigger = LostFocus然后允许自动删除小数点

答案 1 :(得分:0)

您可以通过向数据网格的 ItemsSource 模型添加字符串属性“PriceAsString”来解决该问题。然后在新属性的 setter 中将字符串转换为小数,并将值分配给 Price。然后只需将 DataGridTextColumn 绑定到 PriceAsString 属性。还需要在 'Price' 属性设置器中添加转换,以便 Price 和 PriceAsString 始终同步。

属性可能看起来像这样

        private decimal? _price;
        public decimal? Price 
        { 
            get { return _price; } 
            set 
            {
                if (value != _price)
                {
                    _priceAsString = value.ToString();
                }

                _price = value;
            }
        }

        // Acts as a buffer for 'Price' so that the view doesn't remove decimals while typing in a control with 'UpdateSourceTrigger = PropertyChanged'
        private string _priceAsString;
        public string PriceAsString
        {
            get { return _priceAsString; }
            set
            {
                _priceAsString = value;
                Price = decimal.Parse(_priceAsString, CultureInfo.InvariantCulture);
            }
        }

诚然,我对这个解决方案并不感冒,因为它增加了模型的膨胀并使事情变得有点复杂。但是如果你绝对需要使用UpdateSourceTrigger=PropertyChanged,那么也许总比没有好...

如果您这样做,您可能还需要考虑添加一些文本验证,因为这将允许文本列接受非数字/十进制字符。