2017-02-15 130 views
3

(注:我使用Xamarin.Forms和Rg.Plugins.Popup擴展名)C#動態基於類的類型生成視圖,視圖模型

假設我有以下幾點看法:

MyView1.xaml 
MyView2.xaml 
MyView3.xaml 

我有他們相應的視圖模型:

MyViewModel1.cs 
MyViewModel2.cs 
MyViewModel3.cs 

我想我的導航控制器中的方法顯示基於類型的視圖。

NavigationController.ShowView(typeof(MyView1)); 

也許

NavigationController.ShowView(typeof(MyView1), typeof(MyViewModel1)); 

我怎麼能實現呢?

目前我列了清單:

{ 
    List<MyView> viewList = new List<MyView>(); 

    MyView1 view1 = new MyView1(); 
    MyViewModel1 viewModel1 = new MyViewModel1(); 
    view1.BindingContext = viewModel1; 
    viewList.Add(view1); 
    // etc ... 
} 

static public void ShowView(Type type) 
{ 
    foreach (MyView v in viewList) 
    { 
     if (v.GetType() == type) 
     { 
      // code to show the view. 
     } 
    } 
} 

我遇到的問題是,顯示視圖,當它被駁回後,它本身設置爲null。因此,我不想預先生成視圖並將它們存儲在列表中,而是想生成新視圖。

回答

1

很容易...

public static View CreateView(Type vType, Type vmType) 
{ 
    var view = (View)Activator.CreateInstance(vType); 
    view.BindingContext = Activator.CreateInstance(vmType); 
    return view;  
} 
+0

真棒!謝謝。 –

+0

這效果很好。快速的問題 - 通常建議每次進入頁面時創建新的視圖/視圖模型?或者一次創建視圖/視圖模型,將其存儲在列表中,然後重新使用它。 –

+0

@Stephane如果VIewModel有一個參數構造函數,那麼在這種情況下如何創建VM – Hunt