9

WinRT アプリケーション内で Caliburn.Micro を使用しています

これが私のメインの VM です。

public class MainViewModel : Conductor<Screen>
{
    protected override void OnActivate()
    {
        if (ActiveItem == null)
        {
           ActivateItem(
               ViewModelLocator.LocateForViewType(typeof(NewsFeedView)) as Screen);
        }

        base.OnActivate();
    }
}

ここでは、ContentControl にさまざまなコントロールをロードしたいのでコンダクターを使用しますが、今はこのコードしかありません。メイン ビューのコンテンツ コントロールは次のとおりです。

<ContentControl x:Name="ActiveItem" Grid.Column="1" Grid.Row="1" />

アプリケーションを実行すると、すべて正常に動作し、MainViewModel.Activate呼び出されてにActiveItem設定されNewsFeedViewModelContentControlロードされますNewsFeedView

問題:

メソッドをNewsFeedView使用してコントロール内で別のビューに移動し、そのビューで を使用すると、 に戻り、その瞬間に呼び出されるのはではなくです。添付プロパティを使用しようとしましたが、運がありません。再バインドするにはどうすればよいですか?NavigationService.NavigateToViewModelNavigationService.GoBackMainViewMainViewModel.ActivateActiveItemnullContentControl.ContentnullView.ModelContentControl

編集: 最後に、何が起こるかを確認するために Caliburn でロガーをセットアップしましたが、エラーが見つかりました。

Attaching ***.Views.MainView to ***.ViewModels.MainViewModel.
ViewModel bound on ActiveItem.
Using cached view for ***.ViewModels.NewsFeedViewModel.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Exception: Unspecified error
at Windows.UI.Xaml.Controls.ContentControl.put_Content(Object value)
... some winRT stack
at Caliburn.Micro.View.SetContentPropertyCore(...

それほど有益ではありませんでしたが、InteliTrace を使用して詳細情報を取得したところ、「要素は既に別の要素の子です」というメッセージが表示されました。NewsFeedView がどこかに保存されていて、それを ContentControl に入れるときに、この例外がスローされたと思います。これを解決するには?

4

2 に答える 2

3

ビュー モデルの最初のアプローチを採用する必要があります。つまり、ビュー モデルのインスタンスをアクティブにすると、Caliburn.Micro がビューの場所とバインドを行います。

また、たとえば、ビューモデルをコンストラクターで一度インスタンス化するだけのように見えます。またはOnInitialise:

public MainViewModel()
{
    this.ActivateItem(new NewsFeedViewModel());
}
于 2013-05-21T19:01:55.980 に答える
1

おそらくコンストラクターで@devdigitalが言ったように、ニュースフィードビューモデルを1回だけ初期化し、一度にアクティブなアイテムが1つしかないため、Conductor.Collection.OneActiveを使用しないでください。これはこの状況に使用されます。問題。

于 2013-05-30T17:32:09.577 に答える