2013-11-25 57 views
2

我有一個旨在創建一個窗口的實例,並返回我RelayCommand(基本上,它只是一個MVVMLite輔助方法的功能:傳遞XAML窗口類型的功能

public static RelayCommand NavigateTo(Type navigateTo) 
{ 
    var relayCmd = new RelayCommand (() => Navigate(navigateTo)); 
    return relayCmd; 
} 

private static void Navigate(Type navigateTo) 
{ 
    var newWin = Activator.CreateInstance(navigateTo); 
    ((Window)newWin).Show(); 
} 

然後我把這個在這樣一個單獨的類:

this.MyCommand = Navigation.NavigateTo(View.MyView); 

MyView的是一個有效的窗口,不過,我得到以下編譯錯誤:

The best overloaded method match for 'MyProject.Navigation.NavigateTo(System.Type)' has some invalid arguments 

我可以讓它工作,這樣做:

this.MyCommand = Navigation.NavigateTo(typeof(View.MyView)); 

我的問題是:爲什麼?我正在傳遞一個類型並期待類型。另外,有沒有一種方法可以讓我的NavigateTo函數簡單地接受窗口的類名?

回答

1

事實證明,我想要的是使用泛型,這讓我通過類的類型和處理它的功能:

public static RelayCommand NavigateTo<T>() 
    { 
     Type dest = typeof(T); 
     var relayCmd = new RelayCommand(() => Navigate(dest)); 
     return relayCmd; 
    } 

    private static void Navigate<T>() 
    { 
     object dest = Activator.CreateInstance<T>();    
     ((Window)dest).Show();    
    } 

而且這樣調用:

this.MyCommand = Navigation.NavigateTo<MyView>(); 
+0

有趣的是,我最近剛剛回答了一個類似於Windows Phone的靜態類型導航:http://stackoverflow.com/questions/20004086/is-there-a -typesafe路 - 中 - 導航屏式窗口電話間#20063659分之20063659 –

0

您需要使用typeof來傳遞類型,否則您要傳遞一個類。 typeof抓住了System.Type,這正是你期望的,否則它正在尋找該類中的定義。你也可以使用.GetType()。

+0

如何在不使用'typeof()'或'.GetType()'的情況下傳遞'View.MyView'? –

+0

我真的不認爲你可以。 http://msdn.microsoft.com/en-us/library/vstudio/58918ffs.aspx。您正在詢問System.Type。如果您嘗試傳遞View.MyView,則傳入一個'type',但傳入一個System.Type。 – Recursor

1

I'm passing a type and expecting a type.

你試圖通過一個,但你不能在.net中做到這一點。您只能通過System.Type對象。 您可以通過編寫typeof(MyClass)從課程中獲得System.Type對象。 您可以通過編寫obj.GetType()從對象中獲得一個System.Type對象。

您需要了解/對象/實例之間的差異。

+0

我將分配賞金,因爲這是最高的選票答案,但看到我的答案,因爲這是可能的使用仿製藥 –

+0

@ pm_2是的,你的答案是更好的。我沒有完全理解你的語境> _ < –