2

タイトルは多かれ少なかれそれを要約しています。完全にクリーンな 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 に設定すると、期待どおりに動作しますが、データが失われる可能性があります。小数プロパティ?

ありがとう

4

1 に答える 1

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;

どちらが機能し、正確な結果を返すので、プロパティを設定できます。

于 2013-07-23T04:23:59.293 に答える