2012年5月17日 星期四

C# with Json.NET 多個Constructor

有一次我想要在C#中把object serialize成json然後存到硬碟。我選擇的是Json.NET這個套件。但當我要deserialize的時候卻發現轉不過來。

原因是當你的class有多個或沒有constructor的時候就會有問題。你必須至少有一個constructor而且假設有多個建構子的時候必須要在建構子的宣告上面加上[JsonConstructor]
例如
[JsonConstructor]
public sample(xxx a, yyy b)
{
    
}

Windows 8 Metro Style App Binding

Metro的binding真的有夠難懂。
事情是這樣的,假設你有一個資料結構 plan
public class PlanSource
{
    public ObservableCollection PlanList = new ObservableCollection();
}

public class Plan
{
    public string Name
    {
        set;
        get;
    }
    public ObservableCollection itemList=new ObservableCollection();
}

public class Item
{
    public string DisplayName
    {
        get;
        set;
    }
}

然後你有一個ListView,並且你想要顯示所有PlanList 裡面的Name你可以這樣設計你的ListView

    
    
    
        
            
                
                
            
        
    
    

然後可以在那一頁的cs檔(c#)裡面例如OnNavigatedTo 填上這段
PlanSource ps=new PlanSource();
protected override void OnNavigatedTo(NavigationEventArgs e)
{

    this.DataContext = ps;
}
這樣可以產生什麼效果呢?

  1. 如同一開始說的,這樣可以把PlanList裡面的plan的name顯示在list上
  2. 當資料更新的時候,List裡面的資料也會自己更新。要注意的是,因為我們是希望PlanList會自動更新,因此他必須是ObservableCollection的資料型態。
再進一步,假設同一頁中有另外一個ListView想要顯示PlanListView中被選擇項目的Item的DisplayName。舉例來說,假設PlanList裡面有兩個Plan的物件,他們的Name 分別是plan1 跟plan2,那這個時候PlanListView就會顯示plan1 和plan2 。假設plan1裡也有兩個item他們的DisplayName分別是 item1 跟item2因此我希望當選擇testplan1的時候另外一個ListView可以顯示item1跟item2 e.g. TestPlan Item plan1 ----item1 | --item2 plan2 利用binding可以快速地達到這個目的,我們只要這樣設計另外一個ListView如下
                                          

    
    
                
            
        
    
    

Windows 8 Metro Style App Decoration Design Pattern

目的是這樣的: 有多個頁面想要使用相同判斷邏輯的APP BAR
因此,原本想要使用class繼承button 的control 的方式但是會有error,所以後來想到的方法是在原本的frame裡面嵌一個frame假設叫frame1,然後只要把子頁面的東西顯示在frame1上就可以達到這目的了。