2011-12-12 96 views
23

我一個文本框綁定到一個對象,像這樣:如何使用d:DesignInstance和沒有默認構造函數的類型?

<TextBlock d:DataContext="{d:DesignInstance ViewModel:TaskVM }" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
    </TextBlock> 

現在我想知道如何使它在設計過程中顯示模擬數據。我試着做這樣的事情:

<TextBlock Text="{Binding Path=Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
    <d:DesignProperties.DataContext> 
     <ViewModel:TaskVM Title="Mock"/> 
    </d:DesignProperties.DataContext> 
    </TextBlock> 

然而,由於TaskVM沒有默認的構造函數,我得到一個「沒有默認構造函數」中找到。

我知道,當我使用d:DataContext="{d:DesignInstance ViewModel:TaskVM }"它創建一個模擬數據類型。有沒有辦法讓我設置這個模擬類型的屬性?

謝謝!

回答

37

默認構造需要在XAML被實例化的類型。作爲一種解決方法,您可以簡單地創建TaskVM的子類,該類將具有默認構造函數並將其用作設計時數據上下文。

<TextBlock d:DataContext="{d:DesignInstance ViewModel:DesignTimeTaskVM }" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
</TextBlock> 

另一種方法是設置d:IsDesignTimeCreatableFalse和替代型會爲你在運行時(使用TaskVM類型爲「形狀」)來創建。

<TextBlock d:DataContext="{d:DesignInstance ViewModel:DesignTimeTaskVM, IsDesignTimeCreatable=False}" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
</TextBlock> 
+0

我喜歡這個主意:)。繼承將允許我跳過重新創建所有屬性。我仍然更喜歡有一種內置的方式來操縱WPF創建的模擬對象。它創建了一個模擬對象,不是嗎?它在MSDN文檔中提到:d:IsDesignTimeCreatable \t 在d:DesignInstance標記擴展中,指定從您的類型創建設計實例,而不是由設計器生成的替代類型。 – VitalyB

+0

@VitalyB - 是的,你是對的。它看起來像您可以設置'd:IsDesignTimeCreatable'到'FALSE'和替代型會爲你在運行時創建(使用您的TaskVM類型爲「形狀」)。確切地說, –

+1

。這是非常令人生畏的,我無法設置該替代類型的屬性。 – VitalyB

3

您可以添加一個默認的構造函數到您的虛擬機。然後它可以檢查它是否處於設計時間併爲其屬性設置適當的設計時間值。

+12

另一種選擇是創建一個默認的構造函數,並與 紀念吧'[過時(「只能使用設計模式」,真)]' 因此,如果您嘗試使用它提出了一個編譯錯誤。 – DonkeyMaster

+0

鏈接已死。請參閱此問題:https://stackoverflow.com/q/834283/200443 – Maxence

2

另一種方法是使用一個靜態類來保存視圖模型並調用該類從XAML。 下面是一個例子:

XAML中使用視圖模型工廠創建設計數據方面:

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
mc:Ignorable="d" 
d:DataContext="{x:Static local:ViewModelFactory.ViewModel}" 


靜態ViewModelFactory構建在其構造並將其存儲在視圖模型中的公共屬性它可以從外部訪問(從XAML):

public static class ViewModelFactory 
{ 
    /// <summary> 
    /// Static constructor. 
    /// </summary> 
    static ViewModelFactory() 
    { 
     ViewModel = new TypeOfViewModel(null); 

     // further configuration of ViewModel 
    } 

    public static TypeOfViewModel ViewModel 
    { 
     get; set; 
    } 
} 



請注意ŧ hat TypeOfViewModel類沒有無參數的構造函數。 因此,ViewModelFactory必須通過一些值,在這種情況下,null

所以在這種情況下TypeOfViewModel類需要實現的方式,它知道在設計時傳入的依賴項爲空。

public class TypeOfViewModel 
{ 
    /// <summary> 
    /// Constructor. 
    /// </summary> 
    /// <param name="dependency">May be null at design time</param> 
    public TypeOfViewModel(SomeDependentClass dependency) 
    { 

    } 
} 
相關問題