2011-08-12 2 views
3

私は次のようにリソースディクショナリ内のVMのいずれかのインスタンスを置く:、ObjectDataProviderから "null"をデザインモードで取得する方法は?

<WpfApplication1:UserControl1 x:Name="UsrCtrl1" DataContext="{StaticResource TheViewModel}"/> 

、それは実行時に正常に動作します:私はこれにいくつかのユーザーコントロールのDataContextをバインド

<ObjectDataProvider ObjectType="{x:Type WpfApplication1:MyViewModel}" x:Key="TheViewModel"/> 

すべての接続とサーバーが使用可能であり、多数の論理オブジェクトが正しく初期化されているためです。

問題は、設計時に非常に困難な作業をする例外が多数(このようなVMが多数あります)です。

はC omponentModel:DesignerProperties.IsInDesignMode (xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework")がそうでなければ、私のVM WpfApplication1:MyViewModelを作成し、その後、truex:nullであればXAMLに言って何とかそれは可能です??? 私はたくさんのことを試みましたが、適切な解決策を得ることができませんでしたが、これは不可能だとは思いません。任意のアイデア(おそらくテストされた例)については、事前に感謝します。

答えて

0

これまで私がこれまで対処してきた方法は、あなたのビューモデルのインターフェイスを提供し、ビューがviewmodelロケータクラスからviewmodelを要求することです。たとえば、次のviewmodelsを持っていると思います:

最後に
public class ViewModelLocator 
{ 
    public static IMainViewModel MainViewModel 
    { 
     get 
     { 
      if (Designer.IsDesignMode) 
      { 
       return new FakeMainViewModel(); 
      } 
      else 
      { 
       return new RealMainViewModel(); 
      } 
     } 
    } 
} 

は、あなたがApp.xamlでViewModelLocatorへの参照が含まれます:

public interface IMainViewModel 
{ 
    double Foo { get; } 
    double Bar { get; } 
} 

public class RealMainViewModel : IMainViewModel 
{ 
    // implementation of IMainViewModel, this one does your data access 
    // and is used at run time 
} 

public class FakeMainViewModel : IMainViewModel 
{ 
    // implementation of IMainViewModel, this one is fake 
    // and is used at design time 
} 

のviewmodelロケータは、次のようになります。

<Application.Resources> 
    <ResourceDictionary> 
     <yourNamespace:ViewModelLocator x:Key="ViewModelLocator" /> 
    </ResourceDictionary> 
</Application.Resources> 

このように、あなたはViewModelLocatorでのviewmodelプロパティにバインドし、コードを持っている現実と偽物のviewmodelを注入するための作業を行うことができ、適切な:

<WpfApplication1:UserControl1 x:Name="UsrCtrl1" DataContext="{Binding Path=MainViewModel, Source={StaticResource ViewModelLocator}}"/> 

また、別の例を示すan articleが見つかりました。このコードをメモ帳でオンザフライで書いていますので、誤字がある場合はお詫びします。

0

は、私はあなたが私は通常、デザイナーウィンドウを使用していないので、私は実際にそれをテストしていないデザイン時DataContext

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DataContext="{x:Null}" 

に定義するために、あなたのUserControl1タグに次のように使用することができると信じていますが、理論的にはそれは動作するはずです:)

関連する問題