11

異なるアセンブリに View と ViewModel があります。ビューのアセンブリには VM への参照があります。(コードビハインドが必要な場合もあります)。

ViewModel の DataContext は、XAML ではなくコードで設定されます。したがって、VSもResharperもインテリセンスのように助けることができず、Resharperも多くの警告を出します。

特定のタイプの VM でビューを使用するつもりであることを示すために、XAML コメントで設定できる Resharper のディレクティブはありますか?

アップデート:

受け入れられた回答への追加としての素敵なブログ投稿。

4

2 に答える 2

10

私は同じ問題を抱えていましたが、XAML のデザイン時のサポートを使用して XAML エディターで IntelliSense サポートを取得することで解決しました。これは、Resharper バインディングの検証も満たしています。

以下のコード スニペットで使用されている d: 名前空間に注意してください。これは実行時に無視されます。また、Web サービスやその他のデータ ソースなどの外部ソースからの依存関係を削除して、IoC コンテナーに設計時 (Fake) リポジトリを追加する ViewModelLocator を使用することもできます。

XAML デザイン時のサポート:

<local:ViewBase
    ...
    mc:Ignorable="d" 
    d:DataContext="{Binding Source={d:DesignInstance Type=viewModel:MainViewModel, IsDesignTimeCreatable=True}}">

XAML ViewModelLocator:

<local:ViewBase
    ...
    mc:Ignorable="d" 
    viewModel:ViewModelLocator.ViewModel="MainViewModel" >

ViewModelLocator:

    static ViewModelLocator()
    {
        if (DesignMode.DesignModeEnabled)
        {
            Container.RegisterType<IYourRepository, YourDesignTimeRepository>();
        }
        else
        {
            Container.RegisterType<IYourRepository, YourRuntimeRepository>();
        }

        Container.RegisterType<YourViewModel>();
    }
于 2012-12-30T10:51:16.740 に答える
1

XAML の UIElement の .DataContext プロパティに ViewModel をプレースホルダーとして設定すると、ViewModel を注入したコンストラクターを介して実行時に設定すると置き換えられます。

だから、あなたが持つことができます

<UserControl.DataContext>
    <Pages:WelcomeLoadingViewModel />
</UserControl.DataContext>

次に、UserControls コンストラクターに

public WelcomeLoading(WelcomeLoadingViewModel viewModel)
{
   this.DataContext = viewModel;
}

また

public HomePage()
{
   this.InitializeComponent();

   this.DataContext = ViewModelResolver.Resolve<HomePageViewModel>();

これは、XAML Datacontext から ViewModel を反映できるため、Binding と Resharper のサポートが得られることを意味します。ただし、実行時に VM が DI コンテナーから置き換えられるため、依存関係が注入された ViewModel の利点も享受できます。

于 2012-12-13T16:20:50.267 に答える