Winrt 設計時期的資料繫結,使用CollectionViewSource

Winrt 設計時期的資料繫結

當我們在做 winrt app 時,有些資料是由程式產生或是跟 server 要的,

 

這對設計 UI 的人來說是很麻煩的一件事,

 

因為看不到直接的資料,所以排版有時需要腦補,或是不斷地執行 app 來看看真正的樣子,

 

為了在 Design 時期就可以有資料參考,我們有幾招可以使用。

 

首先,開啟一個空白的 windows store 專案

 

然後我們增加一個 SampleDataSource 的類別用來取得資料,

至於資料的格式,就用一個簡單的 UserData ,裡面有名稱、年紀、信箱、公司來做範例。

程式碼如下

   1:  public class SampleDataSource {
   2:      private ObservableCollection<UserData> _AllUserDatas = new ObservableCollection<UserData>();
   3:      public ObservableCollection<UserData> AllUserDatas {
   4:          get { return _AllUserDatas; }
   5:      }
   6:   
   7:      public SampleDataSource() {
   8:          //if (Windows.ApplicationModel.DesignMode.DesignModeEnabled == true) {
   9:          InitDesignData();
  10:          //}
  11:      }
  12:   
  13:      private void InitDesignData() {
  14:          AllUserDatas.Add(new UserData { Name = "Alan", Company = "A公司", Age = 38, Email = "Alan@demo.com" });
  15:          AllUserDatas.Add(new UserData { Name = "Tom", Company = "A公司", Age = 28, Email = "Tom@demo.com" });
  16:          AllUserDatas.Add(new UserData { Name = "Jack", Company = "B公司", Age = 18, Email = "Jack@demo.com" });
  17:          AllUserDatas.Add(new UserData { Name = "Mary", Company = "A公司", Age = 38, Email = "Mary@demo.com" });
  18:          AllUserDatas.Add(new UserData { Name = "Joe", Company = "B公司", Age = 28, Email = "Joe@demo.com" });
  19:          AllUserDatas.Add(new UserData { Name = "Eric", Company = "C公司", Age = 18, Email = "Eric@demo.com" });
  20:   
  21:      }
  22:  }
  23:   
  24:  public class UserData {
  25:      public string Name { get; set; }
  26:      public int Age { get; set; }
  27:      public string Email { get; set; }
  28:      public string Company { get; set; }
  29:  }

其中第八行註解的地方是用來偵測是否為設計模式,

要在執行時期抓真的資料就可以用此判斷。

 

接著我們切換到 xaml 編輯畫面,在 Page resource 的地方加上

   1:      <Page.Resources>
   2:          <CollectionViewSource
   3:              x:Key="SampleSource"
   4:              IsSourceGrouped="False"
   5:              Source="{Binding AllUserDatas}"
   6:              d:Source="{Binding AllUserDatas, Source={d:DesignInstance IsDesignTimeCreatable=True, Type=local:SampleDataSource}}"/>        
   7:      </Page.Resources>

 

這樣我們就會有一個叫做 SampleSource 的資源,

這裡的第六行就是重點所在, d: 是Blend用到的 namespace,表示是 Design 時期才會用到的屬性,

所以 d:Source 就是設計時期使用的資料來源,

而 Binding 裡面的 Source 屬性用到的 d:DesignInstance 表示設計時期要實體化 Type 物件,

 

我們加上此資源後,在Blend裡就可以直接使用了,

就拿 ListView 當例子,

image

1.先將 ListView 拉到畫面中

2.將長寬設為Auto

3.延展到最大

 

image

點選 ListView 的 ItemsSource 旁邊的小點,然後選擇 Create Data Binding

image

彈出視窗選擇 StaticResource 為 Binding type,

image

選擇剛剛我們在 xaml 裡面增加的資源,按OK

image

就可以看到 ListView 裡面出現資料了,預設行為是顯示物件的名稱,

修改 ListView 的 ItemTemplate 就可以在有模擬資料的情況下設計界面了