【问题标题】:WPF Datagrid DataGridTextColumn does not allow decimalWPF Datagrid DataGridTextColumn 不允许小数
【发布时间】:2014-08-28 23:11:44
【问题描述】:

我无法在 DataGridTextColumn 中输入十进制值。下面的链接表明,如果 UpdateSourceTrigger = PropertyChanged,我们不能输入十进制值。

WPF DataGridTextColumn binding doesn't accept decimals

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

请提出建议。

下面是我的 Datagrid 的代码 sn-p:

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

【问题讨论】:

  • 必须是UpdateSourceTrigger=PropertyChanged吗?
  • 您是否也尝试绑定到模板列中的文本框?
  • 你也可以在这里添加ZeroToEmptyConverter的代码吗?
  • 最终我不得不将 UpdateSoruceTrigger 属性更改为 LostFocus。没有其他选择适合我。仍在为这种情况寻找任何解决方案。谢谢。

标签: wpf wpfdatagrid wpftoolkit wpf-4.0


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以通过将字符串属性“PriceAsString”添加到数据网格的 ItemsSource 模型来解决该问题。然后在新属性的 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,那也许总比没有好...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多