模式=双向绑定,UpdateSourceTrigger=PropertyChanged还是LostFocus?

5
我使用Observable Collection将数据库中的表绑定到DataGrid上:
class ViewModel:INotifyPropertyChanged
{
    private BDDInterneEntities _BDDInterneEntities;

    public ViewModel()
    {
        _BDDInterneEntities = new BDDInterneEntities();
        ResultatCollection = new ObservableCollection<Resultat>(_BDDInterneEntities.Resultat);

    }         
    public ObservableCollection<Resultat> ResultatCollection { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
}

这是我的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=LostFocus}" Header="PMRQ"></DataGridTextColumn>
        <DataGridTextColumn x:Name="LibellePMRQ" Width="*" Binding="{Binding Path=.LibelléTOTApres, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Header="Libellé PMRQ"></DataGridTextColumn>
        <DataGridTextColumn x:Name="Ligne" Width="*" Header="Ligne"></DataGridTextColumn>
        <DataGridTextColumn x:Name="OTM" Width="*" Header="OTM"></DataGridTextColumn>
        <DataGridTextColumn x:Name="TOTM" Width="*" Header="TOTM"></DataGridTextColumn>
        <DataGridTextColumn x:Name="LibelleTOTM" Width="*" Header="Libellé OTM"></DataGridTextColumn>
        <DataGridTextColumn x:Name="GA" Width="*" Header="GA"></DataGridTextColumn>
        <DataGridTextColumn x:Name="Discipline" Width="*" Header="Discipline"></DataGridTextColumn>
        <DataGridTextColumn x:Name="DisciplineSubstituee" Width="120" Header="Discipline Substituée"></DataGridTextColumn>
        <DataGridTextColumn x:Name="colonnesupp" Width="*" Header="colonne supp"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

单向绑定很好用,我可以从我的表格中看到数据传递到了我的DataGrid里。

我搜索了关于如何将数据从我的DataGrid发送到数据库的可能性,发现了双向绑定模式和UpdateSourceTrigger属性:http://msdn.microsoft.com/fr-fr/library/system.windows.data.binding.updatesourcetrigger(v=vs.110).aspx

我认为这是一种很好的解决方案来执行此绑定,但我不确定该怎么做。对于我来说,UpdateSourceTrigger最好的属性是LostFocus还是PropertyChanged?仅仅这样就够了吗?我的代码只能进行单向绑定,另一种方式无法运行。

编辑1: 这是app.config文件中有趣的部分:

<connectionStrings>
    <add name="BDDInterneEntities" connectionString="metadata=res://*/ModelBddInterne.csdl|res://*/ModelBddInterne.ssdl|res://*/ModelBddInterne.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\BDDInterne.mdf;integrated security=true;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.entityClient" />
1个回答

11
使用 Binding.UpdateSourceTrigger 属性是相当直接的。它会影响 UI 中所做的属性更改何时会反映到其绑定的数据源对象中,这些对象可以在代码后面或视图模型中使用。根据 MSDN 上的 UpdateSourceTrigger 枚举 页:

LostFocus: 每当绑定目标元素失去焦点时更新绑定源。

PropertyChanged: 每当绑定目标属性更改时立即更新绑定源。

您选择哪个取决于您的要求。如果您希望 Binding 和任何可能使用的验证在用户键入每个字符时都更新,则选择 PropertyChanged 值。如果您希望 Binding 和任何可能使用的验证在用户将选项卡从每个控件上移到其他控件或选择其他控件时更新,则选择 LostFocus 值。
现在,为了澄清 Binding.Mode Property 的用法,您应该知道 OneWayOneWayToSource 值的方向。来自 MSDN 上链接的 Mode 页面:

TwoWay 在目标属性或源属性更改时更新目标属性或属性。

OneWay 仅在源属性更改时才更新目标属性。

OneTime 仅在应用程序启动或 DataContext 发生更改时才更新目标属性。

OneWayToSource 在目标属性更改时更新源属性。

默认值使目标属性的默认模式值被使用。

进一步澄清,此处所指的目标是UI控件,而是设置为数据绑定数据源的数据对象。


谢谢您的回答,如果我理解您澄清的内容正确的话,我将不得不使用UpdateSourceTrigger=PropertyChanged,如果它不会占用太多CPU,并且Mode=TwoWay听起来像是OneWay和OneWayToSource的混合。我现在会尝试一下。 - Kraenys
通过使用TwoWay和PropertyChanged,我可以在DataGrid中看到我的数据,但是我没有看到我从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" Binding="{Binding Path=.TOTMPMRQ, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> - Kraenys
你的 Resultat 类是否实现了 INotifyPropertyChanged 接口? - Sheridan
嗯,ViewModel实现了INotifyPropertyChanged接口,但是我觉得Resultat没有实现。我要检查一下。 - Kraenys
我现在已经这样实现了:public partial class Resultat:INotifyPropertyChanged,并且在添加了 using System.CompomentModel 后出现了两个错误:应用程序配置文件中找不到名为 BDDInterneEntities 的连接字符串,我将使用 app.config 进行编辑。另一个错误是 WpfApplication3.Resultat doesn't implement interface member "System.CompomentModel.INotifyPropertyChanged.PropertyChanged,通过在 Resultat 类中添加 public event PropertyChangedEventHandler PropertyChanged 解决了该问题。 - Kraenys
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接