WPF数据网格DataGridTextColumn不允许十进制

ergxz8rk  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(109)

我无法在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>
gopyfrb3

gopyfrb31#

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

ezykj2lf

ezykj2lf2#

您可以通过向datagrid的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,那么也许它总比什么都没有好。..
如果这样做,您可能还需要考虑添加一些文本验证,因为这将允许文本列接受非数字/十进制字符。

bkkx9g8r

bkkx9g8r3#

如何添加Delay像1或2秒的Binding。这将在验证开始之前延迟验证。

<DataGridTextColumn
 x:Name="ColMyDataGrid"
 Header="Price"
 Binding="{Binding Path=Price, Delay=1000,
           Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,
           Converter={StaticResource ZeroToEmptyConverter}}" >

这是恼人的,因为用户必须再次检查小数点,而打字,但良好的临时解决方案,在我的情况。
或者,您可以转到WPF App构造函数并添加以下代码:

public App()
{
     FrameworkCompatibilityPreferences
          .KeepTextBoxDisplaySynchronizedWithTextProperty = false;
}

相关问题