2016-09-28 57 views
0

我在App.xaml定義了以下HeaderTemplate使用在Xamarin UWP一個ListView的頁眉模板:如何使用ListViewRenderer

<DataTemplate x:Key="ListViewGroupHeaderTemplate"> 
    <TextBlock Foreground="Black" Text="Something" /> 
</DataTemplate> 

我使用這種方式在我ListViewRenderer

listView.ItemTemplate = App.Current.Resources["ListViewItemTemplate"] as Windows.UI.Xaml.DataTemplate; 
var gs = new GroupStyle(); 
gs.HeaderTemplate = App.Current.Resources["ListViewGroupHeaderTemplate"] as Windows.UI.Xaml.DataTemplate; 
listView.GroupStyle.Add(gs); 

源我的ListViewCollectionViewSource

CollectionViewSource cvs = new CollectionViewSource(); 
cvs.IsSourceGrouped = true; 

cvs.Source = ((SourceListView)Element).Items; 
if (listView.ItemsSource == null) 
    listView.ItemsSource = cvs.View; 

ItemTemplate效果很好。

這是我的長相ListView如何(白色部分是組頭):

enter image description here

我應該怎麼設置使頭的工作?

UPDATE

我根據答案修改了源(應用於分組到一個簡單的列表):

CollectionViewSource cvs = new CollectionViewSource(); 
    cvs.IsSourceGrouped = true; 
    var items = ((MyListView)Element).Items; 
    var itemsAsOC = items as ObservableCollection<GroupListItem>; 
    List<ListItem> list = new List<ListItem>(); 
    foreach (var item in itemsAsOC) 
    { 
     list.AddRange(item); 
    } 
    var group = from item in list group item by item.Value into grp orderby grp.Key select grp;     
    cvs.Source = group; 

沒有與頭文件改變了,所以我想數據源是正確的但有一些嚴重的Xamarin UWP錯誤模板處理:

enter image description here

更新2:

我測試而不Xamarin渲染,它顯示了標題項目。

enter image description here

然而,當我使用Xamarin渲染,頭都不見了

enter image description here

您可以download和動作進行測試。

回答

0

基本上我在代碼中找不到任何明確的問題,下面是我如何將GroupHeader模板添加到ListView

In App。XAML:

<Application.Resources> 
    <DataTemplate x:Key="ListViewGroupHeaderTemplate"> 
     <TextBlock Foreground="Red" Text="{Binding Key}" /> 
    </DataTemplate> 
    <DataTemplate x:Key="ListViewTemplate"> 
     <TextBlock Foreground="Black" Text="{Binding DateTimeProperty}" /> 
    </DataTemplate> 
</Application.Resources> 

這裏是我的物品類別和我SourceListView

public class ListItem 
{ 
    public DateTime DateTimeProperty { get; set; } 
} 

public class SourceListView 
{ 
    public SourceListView() 
    { 
     Element = from x in Collection group x by x.DateTimeProperty.Year into grp orderby grp.Key select grp; 
    } 

    public IList<ListItem> Collection { get; set; } = new List<ListItem>() 
    { 
     new ListItem() {DateTimeProperty = DateTime.Parse("2011-08-01") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2011-08-21") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2012-04-03") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2012-04-01") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2013-05-15") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2013-05-06") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2013-05-01") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2013-06-01") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2013-06-09") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2014-10-02") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2014-10-11") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2015-12-03") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2016-07-01") }, 
     new ListItem() {DateTimeProperty = DateTime.Parse("2016-07-06") }, 
    }; 

    public IEnumerable<object> Element { get; } 
} 

下面是實現這一點的代碼分組ListView

ListView listView = new ListView(); 
listView.ItemTemplate = App.Current.Resources["ListViewTemplate"] as Windows.UI.Xaml.DataTemplate; 
var gs = new GroupStyle(); 
gs.HeaderTemplate = App.Current.Resources["ListViewGroupHeaderTemplate"] as Windows.UI.Xaml.DataTemplate; 
listView.GroupStyle.Add(gs); 

CollectionViewSource cvs = new CollectionViewSource(); 
cvs.IsSourceGrouped = true; 
cvs.Source = new SourceListView().Element; 
if (listView.ItemsSource == null) 
    listView.ItemsSource = cvs.View; 
rootGrid.Children.Add(listView); 

這裏是繪製圖像:

enter image description here

+0

如果我添加如下代碼:˛'listView.HeaderTemplate= App.Current.Resources [「ListViewGroupHeaderTemplate」] as Windows.UI.Xaml.DataTemplate;',那麼主標題出現,所以我猜,組標題設置不正確。我應該在我的CollectionViewSource中設置_a key_ value_嗎? – Nestor

+0

@Nestor,如果你將'listView.HeaderTemplate = App.Current.Resources [「ListViewGroupHeaderTemplate」]設置爲Windows.UI.Xaml.DataTemplate;',那麼這個頭文件就是這個ListView的主頭文件,你的羣組將無法構建通過項目是爲了,但每個組的頭應該是缺少......「我應該在我的CollectionViewSource中設置一個鍵值」,鍵值是爲組標題,它使用LinQ進行分組,分組時,他們是關鍵 - 值對,所以我使用'Key'來綁定ListViewGroupHeaderTemplate中的'CollectionViewSource',你只需要添加這個模板。 –

+0

我修改了我的模板,_fix title_被替換爲{{Binding Key}},但沒有任何改變。另外,我想一個修復標題應該是可見的,因爲它不依賴任何綁定。我在我的XAML中添加了'GroupStyle',但頭部仍然是一個白色的矩形。很奇怪,阻礙了我的工作。 – Nestor

0

好吧,終於在經歷了一天半的苦苦掙扎之後,我找到了解決辦法。如果某個人有一天面臨與我一樣的問題,我會在這裏發佈。其實這是很奇怪的問題,我不知道這是否是一個錯誤,未實現的功能還是什麼......

解決辦法:

在你UWP自定義呈現你需要這樣做:

protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e) 
    { 
     base.OnElementChanged(e); 

     if (e.NewElement != null) 
     { 
      e.NewElement.GroupHeaderTemplate = new Xamarin.Forms.DataTemplate(() => 
      { 
       var label = new Label(); 

       label.SetBinding(Label.TextProperty, "Country"); 

       return new ViewCell { View = label }; 
      }); 
     } 
    } 

其中「Country」是表示您的Group/Header的類的屬性名稱。