我有一个页面,上面有两个控件,一个数据网格和一个数据表单。
在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
答案 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。