summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue1400.cs
blob: e120e7687e4861765a757258fe2334d22f3c1f69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;

using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;

namespace Xamarin.Forms.Controls
{
	[Preserve (AllMembers=true)]
	[Issue (IssueTracker.Github, 1400, "Group binding errors", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.WinPhone, NavigationBehavior.PushModalAsync)]
    public class Issue1400 : ContentPage
    {
        public static Entry Editfield { get; set; }
        public static ListView List { get; set; }
        public static List<MyGroup> Data { get; set;  }
        public Issue1400 ()
        {
            Data = new List<MyGroup>();
            Data.Add(new MyGroup(){Headertitle = "Header 1"});
            Data.First().Add(new MyData(){Title = "title 1"});
            Data.First().Add(new MyData() { Title = "title 2" });
            Data.Add(new MyGroup() { Headertitle = "Header 2" });
            Data.Last().Add(new MyData() { Title = "title 2a" });
            Data.Last().Add(new MyData() { Title = "title 2b" });


            Editfield = new Entry();
            Editfield.HorizontalOptions = LayoutOptions.FillAndExpand;
            Editfield.BindingContext = Data.First().First();
            Editfield.SetBinding(Entry.TextProperty, "Title");

            Editfield.TextChanged += (sender, args) =>
            {

                AddCell(null);
            };

            List = new ListView();
            List.HorizontalOptions = LayoutOptions.FillAndExpand;
            List.VerticalOptions = LayoutOptions.FillAndExpand;
            List.BackgroundColor = Color.Yellow;
            List.ItemTemplate = new DataTemplate(typeof (VCTest));
            List.GroupHeaderTemplate = new DataTemplate(typeof(VCHeader));
            List.IsGroupingEnabled = true;
            List.ItemsSource = Data;



			Content = new StackLayout () {
				VerticalOptions = LayoutOptions.StartAndExpand,
				HorizontalOptions = LayoutOptions.FillAndExpand,
				Children = { Editfield, List },
				Padding = new Thickness (10, 10, 10, 10)

			};
        }

        public static List<MyGroup> CopyList(List<MyGroup> data)
        {
            var newlist = new List<MyGroup>();
            foreach (var grp in data)
            {
                var grpItem = new MyGroup() { Headertitle = grp.Headertitle };
                foreach (var subItem in grp)
                {
                    var item = new MyData() { Title = subItem.Title };
                    grpItem.Add(item);
                }
                newlist.Add(grpItem);
            }
            return newlist;
        } 

        public static void AddCell(MyData data)
        {
            var newlist = CopyList(Data);

            // just make some changes
            newlist.Last().Add(new MyData() { Title = Editfield.Text });
            newlist.Last().RemoveAt(0);
            newlist.Last().Add(new MyData() { Title = "2nd "+Editfield.Text });

            Data = newlist;

            List.ItemsSource = newlist;
        }
    }

    public class MyData : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

	    string _title;

        public const string PropTitle = "Title";

        public string Title
        {
            get { return _title; }
            set
            {
                if (value.Equals(_title, StringComparison.Ordinal)) return;
                _title = value;
                OnPropertyChanged(new PropertyChangedEventArgs(PropTitle));
            }
        }

        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null) PropertyChanged(this, e);
        }
    }

    public class MyGroup : ObservableCollection<MyData>, INotifyPropertyChanged
    {
	    string _headertitle;

        public const string PropHeadertitle = "Headertitle";

        public string Headertitle
        {
            get { return _headertitle; }
            set
            {
                if (value.Equals(_headertitle, StringComparison.Ordinal)) return;
                _headertitle = value;
                OnPropertyChanged( new PropertyChangedEventArgs(PropHeadertitle));
            }
        }
    }

	internal class VCTest : ViewCell
    {
        public VCTest()
        {
            var label = new Label();
            label.SetBinding(Label.TextProperty, "Title");
            View = label;
        }
    }

	internal class VCHeader : ViewCell
    {
        public VCHeader()
        {
            var label = new Label();
            label.SetBinding(Label.TextProperty, "Headertitle");
            View = label;
        }
    }
}