4

データグリッドとデータフォームの 2 つのコントロールを含むページがあります。

データグリッドには、特定のクラスのすべてのオブジェクトのリストがあります。ユーザーがデータグリッド内の項目を選択すると、選択したオブジェクトがデータフォームに読み込まれます。

dataForm.CurrentItem = view.CurrentItem; ビューは、選択された項目のみを含む PagedCollectionView です。

私の問題は、データフォームの currenitem プロパティを設定するときに、.CurrentItem なしで PagedCollectionView (ビュー) だけを使用すると、データフォームの検証が失われることです。すべての必須フィールドが必須として表示されていません。データフォームの CurrentItem 検証として pcv.CurrentItem を使用すると、正常に動作しますが、別の問題が発生します。

PagedCollectionView の現在のアイテムをデータフォームの現在のアイテムとして使用すると、次のようになります。

ユーザーがデータグリッドでアイテムを選択すると、オブジェクトがデータフォームに正常にロードされます。ユーザーがデータフォームのいずれかのテキストフィールドで特定の値を変更してから、別の項目を選択してデータフォームをロードすると、次のエラーがスローされます。

「アイテムに検証エラーがある場合、またはアイテムが編集中で、AutoCommit が false の場合、通貨を変更できません。代わりに通貨を管理するには、ItemsSource を ICollectionView に設定してください。」データフォームのページング プロパティを使用しておらず、フォームに独自の保存ボタンがあります。

これは私が取り組んでいる最初の Silverlight プロジェクトです。

編集 - データフォームの現在の項目を変更するときに dataform.CommitEdit を使用しました。これが解決しなかったことの 1 つは、フォームに検証エラーがある場合、通貨エラーがスローされることです。とにかくこれをバイパスする方法はありますか。データフォームの AutoEdit が true で AutoCommit が false

4

4 に答える 4

4

サンプルなしでここで何が起こっているのかを正確に判断するのは少し難しいですが、ここに問題の解決に役立つ可能性のある観察結果があります。代わりに、DataGridとDataFormの両方のItemsSourceプロパティをコレクションビューにバインドし、DataFormのCurrentItemプロパティをバインドしないようにしてください。それらは魔法のように同期されます(DataGridで選択されたアイテムがDataFormの現在のアイテムを設定します)-これはCollectionViewの機能です。これで問題が解決する場合と解決しない場合がありますが、どちらにしても問題はありません:)。

露骨な自己宣伝:CollectionViewのこの機能とその他の機能は、私の著書Pro Business Applications withSilverlight4で説明されています:)。

于 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.ツールキット

デバッグ モードでは、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)は、同じオブジェクトが dataForm._collectionView に存在する場合でも 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
private void DataForm_EditEnding(object sender, DataFormEditEndingEventArgs e)
{
    if (e.EditAction == DataFormEditAction.Commit)
    {
        ...
    }
    else
    {
        DataForm1.ValidationSummary.Errors.Clear();
    }
}
于 2013-06-27T10:22:40.843 に答える