Silverlight数据形式currentitem问题

时间:2010-12-06 08:16:50

标签: c# silverlight currency dataform

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

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

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

我的问题是,在设置dataform的currenitem属性时,如果我只使用没有.CurrentItem的PagedCollectionView(view),我将失去对dataform的验证。所有必填字段都不是必需的。如果我使用pcv.CurrentItem作为我的数据形式的CurrentItem验证工作正常,但随后又出现了另一个问题。

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

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

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

我很感激任何帮助,这是我正在开展的第一个银光项目。

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

4 个答案:

答案 0 :(得分:4)

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

明目张胆的自我推销:我的书Pro Business Applications with Silverlight 4中涵盖了CollectionView的这个和其他功能:)。

答案 1 :(得分:1)

我经常遇到这个问题。并始终以及添加新项目。 经过几个令人沮丧的日子后,我下载了Silverlight toolkit的源代码。 (你可以在Programs FIles目录中找到(我的是C:\ Program Files(x86)\ Microsoft SDKs \ Silverlight \ v4.0 \ Toolkit \ Apr10 \ Source)) 编译和引用而不是汇编 System.Windows.Controls.Data.DataForm.Toolkit

在Debug模式下,我们在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.Contains(dataForm.CurrentItem)返回false,即使dataForm._collectionView中存在相同的对象

我改变了条件:

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

DataForm开始正常工作。毫无例外和错误。

答案 2 :(得分:0)

private void DataForm_EditEnding(object sender, DataFormEditEndingEventArgs e)
{
    if (e.EditAction == DataFormEditAction.Commit)
    {
        ...
    }
    else
    {
        DataForm1.ValidationSummary.Errors.Clear();
    }
}

答案 3 :(得分:0)

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