1

ダイアログを開くSilverlightページが表示されました。これは、Webサービスを介してデータベースと通信する高度なロジックを備えた管理ページです。Silverlightクライアント側では、MVVMを最大限に使用します。初めてダイアログを開くと、実装されたロジックに従ってすべてが正常に機能します。

問題: 2回にダイアログを開くと、データバインドセッターが間違った値を受け取り始めます。

コード:

ダイアログの作成方法:

MyPopupViewModel myPopup = new MyPopupViewModel();
Caliburn.Micro.Execute.OnUIThread(() => WindowManager.ShowDialog(myPopup));

最終的に間違った値を取得するバインディングの1つ:

<ComboBox
    ItemsSource="{Binding YesNoItems}"
    SelectedValue="{Binding IsSynchronizing, Mode=TwoWay, Converter={StaticResource BooleanToYesNoConverter}}"
    />

私が試したこと:

  • セッターにブレークポイントを設定します。このようにして、ロジックは正しいが、セッターが2回目に開かれたときに他の値で呼び出されることに気づきました。

  • ゲッターは、開かれたときに{1、2、1}回{1、2、3}回呼び出されていることがわかりました。

  • ダイアログが毎回初期化されることを確認しました。たぶんCaliburn-microは古いものをなんとかしてキャッシュしますが、3回目に開いたときに再び正常に動作するため、長い間キャッシュしないようです。

4

1 に答える 1

0

Viewコードビハインドのダイアログのコンストラクターに次のデコレーターを追加することで解決しました。私はすでにそのデコレータを持っていましたViewModelが、Viewどうやらそれも必要だったようです。

PartCreationPolicy(CreationPolicy.NonShared)]

同僚は、ブレークポイントを設定してから各インスタンスのIDを設定することで、これを見つけるのを手伝ってくれました。そのようにして、いくつかの事例があることを証明しました。とても実用的です。そのため、ビューは再利用するのではなく、毎回再作成するように指示する必要がありました。

最終的なコードビハインドは次のようになります。

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class MyPopupView
{
    public MyPopupView()
    {
        InitializeComponent();
    }
}
于 2012-04-16T10:14:30.643 に答える