2

私のアプリケーション内には、多くのヘルプ ページがあり、それらはすべて同様のレイアウト (ヘッダーと本文) を持っています。

現時点では、ヘルプ ページごとに View、ViewModel、.xaml、および .json ファイルを構成しています。

問題は、私のアプリが約 20 のヘルプ ページ (聞かないでください) を持つところまで肥大化し、ヘルプ ファイルごとにこれらをコピー アンド ペーストすることは明らかに非効率的でエラーが発生しやすいことです。私がしたいのは、単一の HelpViewModel、HelpView、Page_Help.xml、そしてすべてのヘルプ ページに対して、関連するテキスト リソースを含む異なる .json ファイルです。

既存の MvvmCross トピックを調べても、これを達成する方法がわかりません。

したがって、私の XAML には次のような見出しがあります。

<TextView
  style="@style/HelpTextTitle"
  local:MvxBind="{'Text':'Path':'TextSource','Converter':'Language','ConverterParameter':'Heading1'}}"
/>

ViewModel と同じ名前の json ファイル (および automagic によってリンクされる) は、次のようになります。

{
  "Heading1":"Sample Help Heading",
}

そして、引数を受け入れることができる HelpViewModel があります-jsonファイルの名前を言ってください

public string HeaderFile { get; private set; }
public HelpViewModel (string headerFile)
{
  HeaderFile = headerFile;
}

json ファイルは現在、このクラスを介して私が考える ViewModel に関連付けられています。

public class TextProviderBuilder : MvxTextProviderBuilder
...
    protected override IDictionary<string, string> ResourceFiles
    {
        get
        {
            var dictionary = this.GetType()
                .Assembly
                .GetTypes()
                .Where(t => t.Name.EndsWith("ViewModel"))
                .Where(t => !t.Name.StartsWith("Base"))
                .ToDictionary(t => t.Name, t => t.Name);

            dictionary[Constants.Shared] = Constants.Shared;
            return dictionary;
        }
    }         

そして、メインアプリはそれをテキストプロバイダーとして登録します(したがって、ViewModel-Jsonファイルのオートマジックを促進します)。

var builder = new TextProviderBuilder();
this.RegisterServiceInstance<IMvxTextProvider>(builder.TextProvider);

したがって、明らかにここでは、同じ HelpPage リソースを使用したいのですが、そのヘルプ ページのコントロールを、パラメーター (Header1) と同じ名前の (できれば) 別の json ファイル、または必要に応じて別のパラメーターにバインドできます。単一の json ファイル。

どうもありがとう!

マシュー


編集:以下のスチュアートのソリューションは完全に機能します。ViewModel のコンストラクターを通過する RequestNavigate を呼び出すときに、json ファイルの名前を渡すだけです。

return new MvxRelayCommand(() => this.RequestNavigate<GeneralHelpViewModel>(new { helpKey = "DescribeAudioCrimeStatementHelpViewModel" }));

MvvmCross (最近ではない) の正確なビルドでは、MvxLanguageBinder はプライベートであり、アクセスできないため、私がしなければならなかった唯一のことは、独自の MvxLanguageBinder を作成することでした。

Stuartのリンクからバージョンをコピーして貼り付け、それを使用しました:

https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Localisation/MvxLanguageBinder.cs

4

1 に答える 1

1

このタイプの効果を実現するには、いくつかの方法があります。

別のjsonファイルを使い続けたい場合は、おそらく次のようなアプローチをとります...

新しい TextSource を使用するようにバインディングを変更します -CustomTextSource

<TextView
       style="@style/HelpTextTitle"
       local:MvxBind="{'Text':'Path':'CustomTextSource','Converter':'Language','ConverterParameter':'Heading1'}}"
 />

ナビゲーション パラメータを使用してHelpViewModelこれをロードするように作成します。CustomTextSource

 public HelpViewModel (string helpKey)
 {
       CustomTextSource = new MvxLanguageBinder(Constants.GeneralNamespace, helpKey);
 }

 public IMvxLanguageBinder CustomTextSource { get; private set; }

テキスト リソースの読み込みを行うコードを変更して、ヘルプ ファイルを含めます。

protected override IDictionary<string, string> ResourceFiles
{
    get
    {
        var dictionary = this.GetType()
            .Assembly
            .GetTypes()
            .Where(t => t.Name.EndsWith("ViewModel"))
            .Where(t => !t.Name.StartsWith("Base"))
            .ToDictionary(t => t.Name, t => t.Name);

        dictionary[Constants.Shared] = Constants.Shared;

        foreach (var additional in HelpFileList)
        {
             dictionary(additional) = additional;
        } 

        return dictionary;
    }
}  

(ここでは静的なリストであると想定してHelpFileListいますが、リフレクションを使用してこれを行う方法を改善することもできます。)


または、ヘルプ json を 1 つのファイルに再編成する場合は、ヘルプIMvxLanguageBinderキーを使用するカスタムを作成することも検討できます。vNext を使用していると仮定すると、コードはMvxLanguageBinderかなり簡単に適応できるはずです。axml からの呼び出しは58 行目に入ります。


または、これが本当に単なるヘルプ テキストである場合は、この xml と json のアプローチを放棄することを検討できます。代わりに、Web ブラウザー ウィジェット内に表示される埋め込み HTML を使用できます。これは、最も柔軟な長期的なソリューションであり、最も簡単なコンテンツを可能にする可能性があります。今後更新します。

于 2013-05-10T06:56:15.360 に答える