C# 在更改其他单元格时更新数据网格中的单元格
当我更改行中任何单元格的值时,我希望动态更改同一行中的其他单元格。例如,在下面的网格中,当我将第二行中的1更改为3时,值5必须更改为3。(编辑按钮仅将更改保存到数据库中。) 下面是我的C# 在更改其他单元格时更新数据网格中的单元格,c#,wpf,wpfdatagrid,C#,Wpf,Wpfdatagrid,当我更改行中任何单元格的值时,我希望动态更改同一行中的其他单元格。例如,在下面的网格中,当我将第二行中的1更改为3时,值5必须更改为3。(编辑按钮仅将更改保存到数据库中。) 下面是我的DataGrid的xaml代码。我尝试过使用SelectedCellsChanged和SelectionChanged事件,但没有成功 <DataGrid x:Name="MyDataGrid" x:Uid="MyDataGrid" AutoGenerateColumns="False" Heig
DataGrid
的xaml代码。我尝试过使用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>
您采取了错误的方法-不要尝试和依赖于对用户界面事件(如
SelectedCellsChanged
)进行操作
相反,您可以在绑定数据对象的绑定属性的setter中操作和更新相关属性。如果随后为受影响的属性发出属性更改通知(它们应该在自己的setter中执行),则DataGrid
中的值将通过绑定自动更新
示例:
这是人为的,但它应该告诉你我的意思。如果网格的每一行绑定到的数据对象包含一组属性,并且数据对象实现了这些属性,则可以执行以下操作:
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
事件后,网格中的行应通过绑定自动更新。我如何才能做到这一点?对不起,我是wpf的初学者。你能举个例子吗?这会指引我正确的方向,谢谢。通常,我让ViewModels处理所有NotifyPropertyChanged事件,但在这种特殊情况下,可以稍微软化模式,让DataGrid中记录的数据模型自行处理同步。