我无法在 DataGridTextColumn 中输入小数值。如果 UpdateSourceTrigger = PropertyChanged,下面的链接建议我们不能输入小数值。
WPF DataGridTextColumn 绑定不接受小数
但我的要求是我必须保持 UpdateSourceTrigger = PropertyChanged.
请建议。
下面是我的数据网格的代码片段:
<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=LostFocus 然后允许自动删除小数点
您可以通过向数据网格的 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,那么也许总比没有好......
如果这样做,您可能还需要考虑添加一些文本验证,因为这将允许文本列接受非数字/小数字符。
如何在
Delay
中添加 Binding
1 或 2 秒。这将在验证开始之前延迟验证。
<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;
}