2010-12-06 14 views
4

私は、2つのコントロール、データグリッド、およびデータフォームを持つページを持っています。Silverlightデータフォーム現在の問題

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

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

私の問題は、データフォームのcurrenitemプロパティを設定するときに、PagedCollectionView(ビュー)を.CurrentItemなしで使用すると、データフォームの検証が失われます。必要なフィールドはすべて必要に応じて表示されません。私のデータフォームのCurrentItemの検証としてうまくいきますが、別の問題が発生するように私は、pcv.CurrentItemを使用する場合。

Iがデータフォームの現在の項目としてPagedCollectionViewの現在のアイテムを使用する:

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

"アイテムに検証エラーがあるか、 AutoCommitはfalseです。代わりにCurrencyを管理するためにItemsSourceをICollectionViewに設定してください。 " データフォームのページングプロパティを使用していないため、フォームに自分の保存ボタンがあります。

私は何か助けていただきありがとうございます、これは私が取り組んでいる私の最初のシルバーライトプロジェクトです。

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

答えて

4

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

ブラザントの自己プロモーション:CollectionViewのこの機能と他の機能については、私の書籍Pro Business Applications with Silverlight 4 :)で説明しています。

+0

こんにちはクリス、提案のおかげで。私はこの方法を試みましたが、私はまだ同じエラーが発生します。 – user531958

+1

私はJhelumiが彼のポストでやったことを試みた(同じ問題があるようだ)http://stackoverflow.com/questions/3969588/silverlight-4-and-dataform-and-currenitem-and-autocommit – user531958

+0

これは持っているようだ問題を解決しました。 – user531958

1

私はこの問題を多く抱えていました。そして、常に新しいアイテムを追加する。 ほんの少しの時間が過ぎた後、私はSilverlight toolkitというソースコードをダウンロードしました。 (私はC:\ Program Files(x86)\ Microsoft SDKs \ Silverlight \ v4.0 \ Toolkit \ Apr10 \ Source)プログラムFIlesディレクトリにあります) アセンブリの代わりにコンパイルおよび参照System.Windows。

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(データ形式:デバッグモードでControls.Data.DataForm.Toolkitは

我々はDataForm.csで奇妙な行動を参照してください。falseを返すのCurrentItemが)でも、同じオブジェクトは、私は、条件変更

dataForm._collectionView

に存在する:

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

そしてデータフォームが正常に動作を開始しました。例外と間違いなし。

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

あなたは、現在のアイテムをバインドしているとき、あなたがいずれかを持っている場合、BindingItem.ValidationErrors.Clear()それらをクリア任意の検証エラーをチェックします;アイテムをデータフォームにバインドします。

関連する問題