3

MVVM を使用して WPF アプリケーションを作成しています。私は自分のアイテムの ObservableCollection を持っています:

public ObservableCollection<VarValue> Values;

public class VarValue: INotifyPropertyChanging, INotifyPropertyChanged
{
    public double value
    {
        get
        {
            return this._value;
        }
        set
        {
            if (this._value != value)
            {
                this.OnvalueChanging(value);
                this.SendPropertyChanging();
                this._value = value;
                this.SendPropertyChanged("value");
                this.OnvalueChanged();
            }
        }
    }
}

これは dataGrid1 にバインドされています。

dataGrid1.ItemsSource = Values;

<DataGrid EnableColumnVirtualization="true" EnableRowVirtualization="true" Name="dataGrid1" DockPanel.Dock="Top" AutoGenerateColumns="False" Height="120" Width="Auto" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False" SelectionUnit="Cell">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate><TextBlock Text='{Binding Values.value}'/></DataTemplate></DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate><TextBox Text='{Binding Values.value, Mode=TwoWay}'/></DataTemplate></DataGridTemplateColumn.CellEditingTemplate>
</DataGrid>

ユーザーが dataGrid1 セルを編集するとき、新しい VarValue オブジェクトを作成し、それを既存のコレクションに挿入する必要があります。例えば:

  • データグリッドには、値が 1 のセルが 1 つ含まれています
  • ユーザーはそれを value=2 に変更します
  • 現在、テーブルには 2 つのセルが必要です: 1 と 2 の値があります。

どうすればそれを達成できますか?

4

1 に答える 1

1

VarValueのラッパーを作成し、それをグリッドにバインドできます。

public class VarValueVM : INotifyPropertyChanged
{
    private VarValue _value;
    private ObservableCollection<VarValueVM> _values;

    public VarValueVM(VarValue value, ObservableCollection<VarValueVM> values)
    {
        _value = value;
        _values = values;
    }

    public double value
    {
        get
        {
            return _value.value;
        }
        set
        {
            if (this._value.value != value)
            {
                _values.Add(new VarValueVM(new VarValue() { value = value }, _values));
                this.SendPropertyChanged("value"); //In order to tell the grid that value did not change finally...
            }
        }
    }
}
于 2012-07-04T11:17:18.477 に答える