2011-08-12 36 views
3

我把VM的一個實例在資源字典,如:如何在設計模式下從ObjectDataProvider獲得「null」?

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

我結合一些用戶控件的DataContext這樣:

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

,並在運行時工作正常,因爲所有連接和服務器都可用,並且許多邏輯對象都被正確初始化。

問題是,在設計時我得到了很多例外(有很多這樣的虛擬機),這使得工作非常困難。

是否有可能以某種方式在XAML說如果C omponentModel:DesignerProperties.IsInDesignMode (xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework")true然後x:null,否則會造成我的VM WpfApplication1:MyViewModel ??? 我嘗試了很多,但無法得到正確的解決方案,但我無法相信這是不可能的。對於任何想法(可能是一個測試的例子)預先感謝。

回答

0

我過去處理過這個問題的方式涉及爲視圖模型提供一個接口,並讓視圖從視圖模型定位器類中請求它們的視圖模型。例如,你有以下的ViewModels:

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 
} 

視圖模型定位器看起來像下面這樣:

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

最後,你會包括App.xaml中以ViewModelLocator參考:

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

這樣,您就可以綁定到視圖模型財產ViewModelLocator和你的代碼做注射真假視圖模型的工作在適當的時候:

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

我還發現an article提供了另一個例子。請注意,我在記事本中即時編寫了此代碼,因此如果有任何錯別字,我很抱歉。

0

我相信你可以使用你的UserControl1標籤下面來定義設計時DataContext

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

我沒有實際測試過它,因爲我通常不使用設計器窗口,但在理論上它應該工作:)

相關問題