0

コンテキストに応じて、同じビューモデルを参照するいくつかの異なるビューを使用しようとしています。

これは私が持っているものです:

  • ModuleViewModel.cs(「クラスViewModels.ModuleViewModel」を含む)
  • Model.Overview.xaml( "x:Class =" Views.Module.Overview "を含む)

しかし、呼び出し(私のユーティリティライブラリから手動で行う必要があります)ViewLocator.LocateForModel(*viewModel*, null, "Overview")は何も返しません。

私は何が間違っているのですか?CMのドキュメントを読みましたが、大丈夫そうです...

前もって感謝します !

4

1 に答える 1

2

名前空間に実際にOverviewユーザーコントロールがあるとするViews.Moduleと、これはCMによって検出されません。

ModelCMは、元のVM名前空間/タイプ名の一部を削除して検索します。正確なルールは思い出せませんが、カスタマイズすることはできます

デフォルトのルールの場合、正しい名前空間は次のようになります。Views.Model.Overview

名前変換のドキュメントを確認することをお勧めします。

https://caliburnmicro.codeplex.com/wikipage?title=View%2fViewModel%20Naming%20Conventions&referringTitle=Documentation

また:

あなたがVMModelViewModelに電話をかけたので、nametransformerがModelVM名の先頭からも削除する可能性があると推測するのは危険です(ただし、正規表現は文字列の末尾のみをチェックするので、大丈夫かもしれません!

したがって、上記の名前空間の変更が機能しないと仮定すると、ターゲットのビュー名が...になる可能性があります。

最後に-デバッグロガーを実装する価値があるかもしれません-CMはログインターフェイスに対して多くの情報を書き込みますGetLog。実装を提供するメソッドを提供する必要がありますILog(通常、ストリームに書き込むメソッドDebugはトラブルシューティングに十分です)

あなたはあなた自身をBootstrapper.Configure提供することによって(または十分に早い他のどこでも)これを行うことができますFuncLogManager.GetLog

LogManager.GetLog = (type) => { return new DebugLogger(); };

そして実装ILogDebugLoggerます(それはあなたに任せてください!)

編集:LocateForModelブートストラッパーコードでfuncを再実装してみてください:

        ViewLocator.LocateForModel = (model, displayLocation, context) =>
        {
            var viewAware = model as IViewAware;
            if (viewAware != null)
            {
                var view = viewAware.GetView(context) as UIElement;
                if (view != null)
                {
                    LogManager.GetLog(typeof(ViewLocator)).Info("Using cached view for {0}.", model);
                    return view;
                }
            }

            return ViewLocator.LocateForModelType(model.GetType(), displayLocation, context);
        };

次に、デバッグできます(これは、v1.4からソースからリッピングしたものなので、使用しているものによっては1.5がリリースされているため、ソースをもう一度確認することをお勧めします)

https://caliburnmicro.codeplex.com/SourceControl/changeset/view/ae616b841924#src/Caliburn.Micro.Silverlight/ViewLocator.cs

編集:これはSilverlightバージョンでもあるため(コンパイラー条件の一部を取り除いたばかりです)、ソースから最新バージョンを取得する必要があります。

于 2013-03-25T11:08:38.217 に答える