2

当我更改一行中任何单元格的值时,我想动态更改同一行中的其他单元格。例如,在下面的网格中,当我将第二行中的 1 更改为 3 时,5 的值必须更改为 3。(编辑按钮仅将更改保存到数据库中。)

在此处输入图像描述

这是我的 xaml 代码DataGrid。我尝试过使用SelectedCellsChangedSelectionChanged事件,但没有成功。

<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 回答