2011-11-22 26 views
7

最初,我的.xaml表單使用以下行來設置設計器的DataContext,其中視圖模型是非泛型類型(note I'm talking關於設計時間的DataContext,而不是將在運行時使用的實際DataContext)如何將WPF xaml表單的Design DataContext設置爲使用泛型類型參數的類

<Window ... 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
d:DataContext="{d:DesignInstance Dialogs:CustomerSearchDlogViewModel}" 
...> 

現在,而不是CustomerSearchDlogViewModel我有一個通用的SearchDialogViewModel但我不能找出語法將在<窗口>標籤的工作讓我指定視圖模型。

回答

11

這是不可能的,除非該標記擴展(DesignInstance)提供屬性來傳遞類型參數,我懷疑。所以你可能想按照建議進行子類化,或者編寫自己的標記擴展來創建泛型實例(實際上這就是我正在做的現在)。

編輯:這個擴展應該這樣做:

public class GenericObjectFactoryExtension : MarkupExtension 
{ 
    public Type Type { get; set; } 
    public Type T { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var genericType = Type.MakeGenericType(T); 
     return Activator.CreateInstance(genericType); 
    } 
} 

最初我遇到了一些問題,從類型名稱獲取對象的類型,但你可以讓XAML解析器解析式爲你這是整潔:

DataContext="{me:GenericObjectFactory Type={x:Type Dialogs:CustomerSearchDlogViewModel`1}, 
             T=Data:Customer}" 

(注意`1在引用泛型類型結束如果你刪除了x:Type包裹的反引號將導致錯誤。)

+0

我不知道如何做後者,所以如果你這樣做,並寫一個博客或任何可能的幫助,我會成爲一個狂熱的讀者。 – Tod

+0

@Tod:這是一個很大的痛苦,它需要大量的反思,我有點卡住,如果有什麼來自它,我會編輯我的答案並告訴你。 –

+0

@Tod:我想我畢竟找到了一條路。 –

1

一個乾淨的選擇是創建一個新類型剛剛變平一般類型:

public class CustomerSearchDialogViewModel : SearchDialogViewModel<Customer> 
{ 
} 
+0

因爲我已經有了一個CustomerSearchDialogViewModel,它會很好,很簡單,可以清除它的內容,並按照你的建議重新定義它(而不是刪除它)。我沒有想到這一點,它總是很好找出什麼是不能做的。 – Tod

相關問題