タイトルは多かれ少なかれそれを要約しています。完全にクリーンな 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>
DataGrid 内に DataGridTextColumn を含む、非常に単純な MVVM アプリケーションがあります。この DataGridTextColumn の列の 1 つは double プロパティにバインドされ、もう 1 つは decimal プロパティにバインドされます。
これを実行してUnit Stake列の値を修正しようとすると、これを .05 に変更したいので、正確にこれを入力すると、5 に変わります。
これは、Unit Stake Dec 列 (10 進数にバインドされている) では発生しません。これはいくつかの大きな問題を引き起こしているので、ユーザーが.05と入力したときに double プロパティの値が実際には5ではなく.05になるように修正するにはどうすればよいでしょうか?
double プロパティにバインドされた DataGridTextColumn 列の UpdateSourceTrigger プロパティを LostFocus に設定すると、期待どおりに動作しますが、データが失われる可能性があります。小数プロパティ?
ありがとう