C# 绑定模式=仅双向工作;“一”;方式
由于一个可观察的集合,我将数据从数据库集绑定到数据网格。DbSet=>DataGrid的方式工作得很好,但是DataGrid=>DbSet的方式根本不工作 以下是一些代码,向您展示我所做的工作: 首先,具有绑定属性的Datagrid:C# 绑定模式=仅双向工作;“一”;方式,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,由于一个可观察的集合,我将数据从数据库集绑定到数据网格。DbSet=>DataGrid的方式工作得很好,但是DataGrid=>DbSet的方式根本不工作 以下是一些代码,向您展示我所做的工作: 首先,具有绑定属性的Datagrid: <DataGrid x:Name="DonneesBrutes" ItemsSource="{Binding Path=.ResultatCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged
<DataGrid x:Name="DonneesBrutes" ItemsSource="{Binding Path=.ResultatCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,65,0,0" AutoGenerateColumns="False" EnableRowVirtualization="True" RowDetailsVisibilityMode="VisibleWhenSelected">
<DataGrid.Columns>
<DataGridTextColumn x:Name="PMRQ" Width="*" Binding="{Binding Path=.TOTMPMRQ, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="PMRQ"></DataGridTextColumn>
<DataGridTextColumn x:Name="LibellePMRQ" Width="*" Binding="{Binding Path=.LibelléTOTApres, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Libellé PMRQ"></DataGridTextColumn>
<DataGridTextColumn x:Name="Ligne" Width="*" Binding="{Binding Path=.Remarque, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Ligne"></DataGridTextColumn>
<DataGridTextColumn x:Name="OTM" Width="*" Binding="{Binding Path=.TOTMPMRQ, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="OTM"></DataGridTextColumn>
<DataGridTextColumn x:Name="TOTM" Width="*" Binding="{Binding Path=.SiModifie, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="TOTM"></DataGridTextColumn>
<DataGridTextColumn x:Name="LibelleTOTM" Width="*" Binding="{Binding Path=.LibelléTOTApres, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Libellé OTM"></DataGridTextColumn>
<DataGridTextColumn x:Name="GA" Width="*" Binding="{Binding Path=.Groupe_D_alerte, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="GA"></DataGridTextColumn>
<DataGridTextColumn x:Name="Discipline" Width="*" Binding="{Binding Path=.NomTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Discipline"></DataGridTextColumn>
<DataGridTextColumn x:Name="DisciplineSubstituee" Width="120" Binding="{Binding Path=.NomChamp, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Discipline Substituée"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
我听说过DataGrid.Items.refresh()但它听起来不起作用,DataGrid.ItemsSource=null然后DataGrid.ItemsSource=myDataSource,但它也不起作用
我也听说mode=TwoWay和UpdateSourceTrigger=PropertyChanges已经足够了,我完全迷路了
提前谢谢你的帮助
问候。为了接收绑定通知,您必须正确实施INotifyPropertyChanged。您这样做的方式使它可以编译,但其他方面就不多了 每次外部可见的属性发生更改时,您都必须引发
PropertyChanged
事件。这就是为什么您通常会看到这样的代码
private int myProperty;
public int MyProperty
{
get { return myProperty; }
set
{
if (myProperty != value)
{
myProperty = value;
OnPropertyChanged("MyProperty");
}
}
}
当然,如果要向该类的用户通知属性更改,则不能直接写入该字段,而应使用该属性
正如您所看到的,这变得相当乏味,这就是为什么一些MVVM框架提供简化版本,但您也可以使用自己的版本
protected void Set<T>(ref T field, T newValue, string propertyName)
{
if (field != newValue)
{
field = newValue;
OnPropertyChanged(propertyName);
}
}
这是您对
Resultat
的实际实现吗?如果是这样,则您仅在技术上实现了INotifyPropertyChanged
,但如果这些属性发生更改,则忽略它以实际引发事件。(同样适用于ViewModel
)是的,它是Resultat
的实际实现。你的意思是我已经实现了INotifyPropertyChanged,但我还没有定义它应该做什么,对吗?谢谢你的回答,我会吸收你告诉我的内容,并将其应用到我的代码中。如果它有效,我会接受答案。我有一个即将到来的第一个问题,我觉得If循环只针对一个属性,我应该为Resultat的每个字符串做一个循环,还是我错了?如果使用循环,你也引用了我答案中的第一个代码块,那么是的,你必须对你班上的每一个公共或受保护的财产这样做。这只是最后的确认,我应该得到这样的东西吗public string NomTable{get{return NomTable;}set{if(NomTable!=value){NomTable=value;OnPropertyChanged(“”;}}}}}}}}
如果是,我不知道我应该在“”中写什么,因为它是数据库集数据和用户在数据网格中输入的比较。。此代码取自Resultat
字符串是属性的名称,在这种情况下,它应该是“NomTable”。
private int myProperty;
public int MyProperty
{
get { return myProperty; }
set
{
if (myProperty != value)
{
myProperty = value;
OnPropertyChanged("MyProperty");
}
}
}
protected void Set<T>(ref T field, T newValue, string propertyName)
{
if (field != newValue)
{
field = newValue;
OnPropertyChanged(propertyName);
}
}
public int MyProperty
{
get { return myProperty; }
set { Set(ref myProperty, value, "MyProperty"); }
}