0

ReactiveUI では、特定の時点で次のコードを実行します。

const string template = "<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:routing='using:ReactiveUI.Routing'>" +
    "<routing:ViewModelViewHost ViewModel=\"{Binding}\" VerticalContentAlignment=\"Stretch\" HorizontalContentAlignment=\"Stretch\" IsTabStop=\"False\" />" +
"</DataTemplate>";

var theTemplate = XamlReader.Load(template);

他のプラットフォームでは、これはうまく機能します (xmlns宣言はもちろん異なります) が、{WinRT / Metro / Windows ストア} では、これは Unspecified Error をスローします:

WinRT information: The type 'ViewModelViewHost' was not found. [Line: 1 Position: 253]

ザ・ツイスト

ただし、ページにダミー リソースを含めると、次のようになります。

<Page.Resources>
    <DataTemplate x:Name="Foo">
        <routing:ViewModelViewHost ViewModel="{Binding}" />
    </DataTemplate>
</Page.Resources>

...それならうまくいきます!何を与える?

4

1 に答える 1

3

「ねじれ」は、アプリケーションがインスタンス化される型の正しい XAML メタデータを持っていないためだと思います.WPF/Silverlight のような XAML ファイルの型を解決するためにリフレクションを使用するのではなく、WinRT はコード生成を使用してIXamlMetadataProviderインターフェイスを介して解決します (ここにまともな説明があります;これはあなたがやっていることのように聞こえます、フォローアップも参照してください)。参照を追加すると、このメタデータ コードが適切に生成されます。この場合、データ テンプレートを使用せずに、タイプ自体を未使用のキーの下のリソースに追加するだけで、同じ効果を得ることができます。

アプリケーションの "obj" ディレクトリを確認すると、Visual Studio によってXamlTypeInfo.g.cs実装するファイルが生成されIXamlMetadataProviderます。これには、失敗しているタイプのエントリが含まれている必要があります。ダミーの参照を追加した場合は、タイプをインスタンス化するために必要な詳細がすべて含まれている必要があります。これがないと、型型への参照が可能ですが、情報が不十分であることがわかりました。ただし、これにより、フォールスルー動作 (カスタム メタデータ プロバイダーを持つ依存 DLL で型を検索する) を防ぐことができます。

最終的なアプリケーション自体にライブラリ型へのダミー参照を追加する以外に、私が見つけた唯一の解決策は、Bindable属性を型に適用することです。これは C++ に関連していると思われますが、これを C# で使用して、XAML 型メタデータ用に生成されたコードに常に型を強制的に表示できることを発見しました。

于 2013-02-28T15:30:49.097 に答える