0

DataForms 似乎会在用户跳出某个字段时立即更新其 CurrentItem。即使 AutoCommit = false 也会发生这种情况。这种行为的副作用是,绑定到数据的其他控件会在用户编辑数据时更新,而不是在用户单击“确定”以接受 DataForm 更改时更新。有没有办法修改该行为以推迟将数据写入 CurrentItem 到用户接受更改时?

编辑:这是我正在使用的 DataForm 的大部分 Xaml:

xmlns:DataFormControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit"

<DataFormControls:DataForm x:Name="dataForm" AutoCommit="False" AutoEdit="False">           
            <DataFormControls:DataForm.EditTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">

                        <DataFormControls:DataField Label="Title">
                            <TextBox Text="{Binding Title, Mode=TwoWay}" Style="{StaticResource TextBoxStyle}"/>
                        </DataFormControls:DataField>

                        <DataFormControls:DataField Label="First Name">
                            <TextBox Text="{Binding FirstName, Mode=TwoWay}"/>
                        </DataFormControls:DataField>

                        <DataFormControls:DataField Label="Middle Name">
                            <TextBox Text="{Binding MiddleName, Mode=TwoWay}"/>
                        </DataFormControls:DataField>

                        <DataFormControls:DataField Label="Last Name">
                            <TextBox Text="{Binding LastName, Mode=TwoWay}"/>
                        </DataFormControls:DataField>
                    </StackPanel>
                </DataTemplate>
            </DataFormControls:DataForm.EditTemplate>
        </DataFormControls:DataForm>

编辑 2:我用来避免这种行为的解决方法是复制要编辑的对象并将其设置为 DataForm.CurrentItem 属性,然后如果用户接受编辑,则将数据复制回原始对象. 我希望那里有更好的解决方案。

4

1 回答 1

1

一切都绑定到实体的同一个实例。由于 DataForm 字段绑定到实体上的属性,因此当您离开字段时,它会调用属性设置器,更改值并引发 INotifyPropertyChanged.PropertyChanged 事件。然后,这会通知其他绑定控件该值已更改并且它们的绑定已更新。

如果您真的想防止这种情况发生,您需要做一些繁重的工作来克隆 DataForm 绑定到的实体,然后在提交项目时,使用克隆的值更新原始实体。不建议这样做。

或者,您可以拥有多个 DomainContext 实例并加载实体两次——一次用于 DataForm,一次用于其他显示。在一个上提交更改后,您可以为另一个重新加载实体。但是,这可能会导致您的应用程序中出现其他问题,因此也不建议这样做。

我很好奇为什么实时绑定会导致问题。

于 2010-03-11T09:31:55.553 回答