2

行内の任意のセルの値を変更するときに、同じ行内の他のセルを動的に変更したいと考えています。たとえば、次のグリッドでは、2 行目の 1 を 3 に変更すると、5 の値が 3 に変更される必要があります(編集ボタンは変更をデータベースに保存するだけです)。

ここに画像の説明を入力

これが私の.xamlコードですDataGrid。イベントを使用してみSelectedCellsChangedましSelectionChangedたが、成功しませんでした。

<DataGrid x:Name="MyDataGrid" x:Uid="MyDataGrid" AutoGenerateColumns="False" 
    Height="226" HorizontalAlignment="Left" Margin="106,111,0,0"
    VerticalAlignment="Top" Width="684" ColumnWidth="*"
    AlternationCount="2" SelectionMode="Single"
    SelectedCellsChanged="MyDataGrid_SelectedCellsChanged"
    SelectionChanged="MyDataGrid_SelectionChanged" >

    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=ProductName}" Header="Ürün Adı" />
        <DataGridTextColumn Binding="{Binding Path=StoreName}" Header="Şube Adı" />
        <DataGridTextColumn Binding="{Binding Path=Day1}" Header="Pazartesi" />
        <DataGridTextColumn Binding="{Binding Path=Day2}" Header="Salı" />
        <DataGridTextColumn Binding="{Binding Path=Day3}" Header="Çarşamba" />
        <DataGridTextColumn Binding="{Binding Path=Day4}" Header="Perşembe" />
        <DataGridTextColumn Binding="{Binding Path=Day5}" Header="Cuma" />
        <DataGridTextColumn Binding="{Binding Path=Day6}" Header="Cumartesi" />
        <DataGridTextColumn Binding="{Binding Path=Day7}" Header="Pazar" />
        <DataGridTemplateColumn Header="Edit Row">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Edit" Click="EditButton_Click" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
4

1 に答える 1

7

あなたは間違ったアプローチをとっていますSelectedCellsChanged.

代わりに、バインドされたデータ オブジェクトのバインドされたプロパティのセッターで、関連するプロパティを操作および更新できます。次に、影響を受けるプロパティのプロパティ変更通知を起動すると (独自のセッターで行う必要があります) DataGrid、バインディングを介して の値が自動的に更新されます。

例:

これは不自然ですが、私の言いたいことがわかるはずです。グリッドの各行がバインドされるデータ オブジェクトにプライベート バッキング メンバーを持つ一連のプロパティが含まれており、データ オブジェクトがINotifyPropertyChangedを実装している場合、次のようなことができます。

public class MyDataClass : INotifyPropertyChanged
{
    public int Day1
    {
        get { return _day1; }
        set 
        {
            _day1 = value;
            UpdateProperties();
        }
    }

    public int Day2
    {
        get { return _day2; }
        set 
        {
            _day2 = value;
            UpdateProperties();
        }
    }

    // etc, repeat for the next three 'Day' properties

    private void UpdateProperties()
    {
        //adjust the private backing members for each property:
        _day1 = someValue;
        _day2 = someOtherValue;

        OnPropertyChanged("Day1");
        OnPropertyChanged("Day2");
        //etc, notify for each property that you adjusted
    }

    private void OnPropertyChanged(string propertyName)
    {
        handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangeEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private int _day1, _day2, //etc... ;
}

もちろん、これを行うときは、プロパティの設定に非常に注意する必要があります.スタックオーバーフローを引き起こす循環呼び出しの状況にはなりたくありません. プライベート バッキング メンバーを調整し、PropertyChanged更新されたプロパティごとにイベントを発生させた後、グリッド内の行はバインディングを介して自動的に更新されます。

于 2013-06-13T00:27:13.077 に答える