Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定模式=仅双向工作;“一”;方式_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

C# 绑定模式=仅双向工作;“一”;方式

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

由于一个可观察的集合,我将数据从数据库集绑定到数据网格。DbSet=>DataGrid的方式工作得很好,但是DataGrid=>DbSet的方式根本不工作

以下是一些代码,向您展示我所做的工作:

首先,具有绑定属性的Datagrid:

<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"); }
}