4

我有一个页面,上面有两个控件,一个数据网格和一个数据表单。

在数据网格中,我有一个特定类的所有对象的列表。当用户在数据网格中选择一个项目时,数据表单将与所选对象一起加载。

dataForm.CurrentItem = view.CurrentItem; view 是一个 PagedCollectionView ,它只包含选定的项目。

我的问题是,在设置数据表单的 currenitem 属性时,如果我只使用没有 .CurrentItem 的 PagedCollectionView(视图),我会丢失对数据表单的验证。并非所有必填字段都被视为必填。如果我使用 pcv.CurrentItem 作为我的数据表单的 CurrentItem 验证工作正常,但是会出现另一个问题。

当我使用 PagedCollectionView 的当前项作为数据表单的当前项时:

用户在数据网格中选择一个项目,并且该对象在数据表单中加载良好。如果用户更改数据表单上任何文本字段中的某个值,然后选择不同的项目来加载数据表单,则会引发以下错误:

“当项目存在验证错误或正在编辑且 AutoCommit 为假时,无法更改货币。将 ItemsSource 设置为 ICollectionView 以改为管理货币。” 我没有使用数据表单的分页属性,并且我在表单上有自己的保存按钮。

我将不胜感激,这是我正在从事的第一个 Silverlight 项目。

编辑 - 我在更改数据表单的当前项时使用了 dataform.CommitEdit。这没有解决的一件事是,如果表单上存在验证错误,则会引发货币错误。反正有没有绕过这个。数据表单的 AutoEdit 为 true,AutoCommit 为 false

4

4 回答 4

4

如果没有样本,很难确定这里发生了什么,但这里有一个可能有助于解决问题的观察结果。而是尝试将 DataGrid 和 DataForm 的 ItemsSource 属性绑定到集合视图,并且不要绑定 DataForm 的 CurrentItem 属性。它们神奇地保持同步(DataGrid 中的选定项将设置 DataForm 中的当前项) - 这是 CollectionView 的一个功能。这可能会也可能不会解决您的问题,但无论哪种方式都不会伤害:)。

公然的自我推销:CollectionView 的这个和其他特性在我的书Pro Business Applications with Silverlight 4中有介绍:)。

于 2010-12-06T09:04:06.723 回答
1

我有这个问题很多次。并且总是以防万一添加新项目。经过几天的沮丧后,我下载了Silverlight 工具包的源代码。(您可以在 Programs FIles 目录中找到(我的是 C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Toolkit\Apr10\Source))编译和引用而不是汇编System.Windows.Controls.Data .DataForm.Toolkit

在调试模式下,我们在 DataForm.cs 中看到奇怪的行为:

private static void OnCurrentItemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            DataForm dataForm = d as DataForm;
            if (dataForm != null && !dataForm.AreHandlersSuspended())
            {
                if (dataForm._lastItem != null && dataForm.ShouldValidateOnCurrencyChange)
                {
                    dataForm.ValidateItem();
                }

                if ((!dataForm.AutoCommitPreventsCurrentItemChange && dataForm.IsItemValid) &&
                    (e.NewValue == null ||
                    dataForm._collectionView == null ||
                    dataForm._collectionView.Contains(dataForm.CurrentItem) 
                    ))
                {
                    dataForm.SetUpNewCurrentItem();
                    dataForm.GenerateUI(true /* clearEntityErrors */, true /* swapOldAndNew */);
                    dataForm.UpdateCurrentItem();
                    SetAllCanPropertiesAndUpdate(dataForm, false /* onlyUpdateStates */);
                    dataForm._lastItem = dataForm.CurrentItem;
                    dataForm.OnCurrentItemChanged(EventArgs.Empty);
                }
                else
                {
                    dataForm.SetValueNoCallback(e.Property, e.OldValue);
                    throw new InvalidOperationException(string.Format(Globalization.CultureInfo.InvariantCulture, System.Windows.Controls.Data.DataForm.Toolkit.Resources.DataForm_CannotChangeCurrency, "AutoCommit", "ItemsSource", "ICollectionView"));
                }
            }
        }

即使 dataForm._collectionView 中存在相同的对象, dataForm._collectionView.Contains(dataForm.CurrentItem)也会返回 false

我改变了条件:

if ((!dataForm.AutoCommitPreventsCurrentItemChange && dataForm.IsItemValid) &&
                    (e.NewValue == null ||
                    dataForm._collectionView == null ||
                    dataForm._collectionView.Contains(dataForm.CurrentItem) || 
                    dataForm.CurrentItem == e.NewValue
                    ))

DataForm 开始工作正常。没有例外和错误。

于 2012-12-07T14:08:05.180 回答
0

在绑定当前项目时检查是否有任何验证错误,如果有则清除它们 BindingItem.ValidationErrors.Clear(); 然后将项目绑定到数据表单。

于 2013-09-06T10:31:19.223 回答
0
private void DataForm_EditEnding(object sender, DataFormEditEndingEventArgs e)
{
    if (e.EditAction == DataFormEditAction.Commit)
    {
        ...
    }
    else
    {
        DataForm1.ValidationSummary.Errors.Clear();
    }
}
于 2013-06-27T10:22:40.843 回答