27

UI をインターフェイスにバインドしています (複数のプレゼンターによって実装され、UI アセンブリからはアクセスできません)。

R# を使用して xaml を強く型付けするため、デザイナーの d:DesignInstance が本当に気に入っています。

残念ながら、d:DesignInstance はインターフェイス タイプをサポートしていません。「インターフェイスのインスタンスを作成できません。」

インターフェイスのデザイン インスタンス

私が最初に考えたのは、問題ありません。System.Type をパラメーターとして取り、ProvideValue メソッドがその偽のインスタンスを返すカスタム マークアップ拡張機能を作成しましょう (動的 IL 放出によって生成されたこのインターフェイスのダミー実装)。 .

これは非常にうまく機能し、バインディングは設計時に解決されます (マークアップ拡張機能がオブジェクト プロパティを lorem-ipsum で埋めるため、デザイン パネルで確認できます)。

しかし、最も優れた R# 機能は機能しません。Resharper はデータ コンテキスト タイプを認識せず、「タイプ 'オブジェクト' のデータ コンテキストでプロパティ '{0}' を解決できません」というメッセージを表示するだけです

カスタム マークアップ拡張機能

誰かがこれを修正する方法を知っていますか?

(R#にインターフェイスのデータコンテキストタイプを知らせることができる代替手段は素晴らしいでしょう)

ありがとう !

ps: DesignInstance に渡すために、生成されたランタイム タイプを返す別のマークアップ拡張機能も作成しようとしました: "{d:DesignInstance Type={utilsUi:InstanceType commons:User}}" => エラー「Object of type 'InstanceType' はタイプ 'System.Type' に変換できません" ... DesignInstance は内部マークアップ拡張機能をサポートしていないようです :(

4

4 に答える 4

41

この非論理的な Visual Studio XAML デザイナー エラーを克服する方法を発見しました。

それ以外の

<SomeControl d:DataContext={d:DesignInstance commons:IUser}>
    <!--element content here-->
</SomeControl>

あなたは書ける

<SomeControl>
    <d:SomeControl.DataContext>
        <x:Type Type="commons:IUser" />
    </d:SomeControl.DataContext>
    <!--element content here-->
</SomeControl>

はい、このソリューションはクールに見えませんが、それほど悪くはありません。

Typeタグでは、インターフェイス、ネストされた型 (例: n:A+B)、さらにはジェネリックを指定できます!

ジェネリックの場合は、バックティックと型引数の数を type: に追加するだけです<x:Type Type="commons:User`1" />

ところで、これらはすべてスタイルでも機能し、<d:Style.DataContext>エラーは発生しません!

于 2017-10-09T00:51:38.127 に答える
19

この場合、次のように IsDesignTimeCreatable を利用できます。

d:DataContext="{d:DesignInstance commons:User, IsDesignTimeCreatable=False}"

これは基本的に、設計インスタンスを実際にインスタンス化しようとするのではなく、インテリセンスとエラーの強調表示にのみ型を使用するように設計者に指示します。

于 2013-11-20T23:15:07.053 に答える