标题或多或少总结了它。如果我们有一个完全干净的WPF应用程序,并添加以下ViewModel:
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace WpfApplication10
{
public sealed class ViewModel
{
private readonly ObservableCollection<MyObject> _myObjects = new ObservableCollection<MyObject>();
public ViewModel()
{
for (var i = 0; i < 5; i++)
{
_myObjects.Add(new MyObject(i, i));
}
}
public ObservableCollection<MyObject> MyObjects
{
get { return _myObjects; }
}
}
public sealed class MyObject : INotifyPropertyChanged
{
private double _unitStake;
private decimal _unitStakeDecimal;
public decimal UnitStakeDecimal
{
get { return _unitStakeDecimal; }
set
{
if (value == _unitStakeDecimal) return;
_unitStakeDecimal = value;
OnPropertyChanged("UnitStakeDecimal");
}
}
public MyObject(double unitStake, decimal unitStakeDecimal)
{
UnitStake = unitStake;
UnitStakeDecimal = unitStakeDecimal;
}
public double UnitStake
{
get { return _unitStake; }
set
{
if (value.Equals(_unitStake)) return;
_unitStake = value;
OnPropertyChanged("UnitStake");
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
然后将以下XAML添加到MainWindow:
<Window x:Class="WpfApplication10.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" DataContext="{StaticResource ViewModel}">
<Grid>
<DataGrid CanUserAddRows="False" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding MyObjects}" RowDetailsVisibilityMode="VisibleWhenSelected" Grid.Row="1">
<DataGrid.Columns>
<DataGridTextColumn Header="Unit Stake"
Binding="{Binding UnitStake,UpdateSourceTrigger=PropertyChanged}"
Width="Auto" />
<DataGridTextColumn Header="Unit Stake Dec"
Binding="{Binding UnitStakeDecimal,UpdateSourceTrigger=PropertyChanged}"
Width="Auto" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
我们有一个超级简单的MVVM应用程序,在DataGrid中包含DataGridTextColumn。此DataGridTextColumn中的一列绑定到double属性,另一列绑定到十进制属性。
当我们运行此操作并尝试修改单元赌注列中的值时,我们可以说我们要将其更改为.05,因此请输入此格式,它会更改为5.
这不会发生在Unit Stake Dec列(绑定到小数)上。这会导致一些重大问题,所以如何解决这个问题,以便当用户键入 .05 时,double属性的值实际上是 .05 而不是 5
如果我将绑定到double属性的DataGridTextColumn列的UpdateSourceTrigger属性设置为LostFocus,那么事情按预期工作,但这里有可能丢失数据,为什么我不必在列上执行此操作绑定到十进制属性?
由于
答案 0 :(得分:0)
您是否对下面的代码行提出了任何想法
if (value.Equals(_unitStake)) return;
查看在ViewModel类中创建MyObject实例的时间
for (var i = 0; i < 5; i++)
{
_myObjects.Add(new MyObject(i, i));
}
所以它们基本上是用整数类型初始化的,当你做
时value.Equals(_unitStake)
它总是返回false,因为两种类型都不相等。因此,您无法设置属性StakeUnit。 在UnitStakeDecimal的情况下,你比较它们的值
if (value == _unitStakeDecimal) return;
哪个有效并返回确切结果,因此您可以设置属性。