summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Pages/DataView.cs
blob: 983328ee4da5f550cc00e0e2b4f51c5cbd7b1358 (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
using System.Collections.Generic;
using System.Linq;

namespace Xamarin.Forms.Pages
{
	public class DataView : ContentView, IDataSourceProvider
	{
		public static readonly BindableProperty DataProperty = BindableProperty.Create(nameof(Data), typeof(IEnumerable<IDataItem>), typeof(DataView), default(IEnumerable<IDataItem>));

		public static readonly BindableProperty DataSourceProperty = BindableProperty.Create(nameof(DataSource), typeof(IDataSource), typeof(DataView), null, propertyChanged: OnDataSourceChanged);

		public static readonly BindableProperty DefaultItemTemplateProperty = BindableProperty.Create(nameof(DefaultItemTemplate), typeof(DataTemplate), typeof(DataView), default(DataTemplate));

		readonly HashSet<string> _maskedKeys = new HashSet<string>();

		public DataView()
		{
			SetBinding(DataProperty, new Binding("DataSource.Data", source: this));
		}

		public IEnumerable<IDataItem> Data
		{
			get { return (IEnumerable<IDataItem>)GetValue(DataProperty); }
			set { SetValue(DataProperty, value); }
		}

		public DataTemplate DefaultItemTemplate
		{
			get { return (DataTemplate)GetValue(DefaultItemTemplateProperty); }
			set { SetValue(DefaultItemTemplateProperty, value); }
		}

		public IDataSource DataSource
		{
			get { return (IDataSource)GetValue(DataSourceProperty); }
			set { SetValue(DataSourceProperty, value); }
		}

		void IDataSourceProvider.MaskKey(string key)
		{
			_maskedKeys.Add(key);
			IDataSource dataSource = DataSource;
			if (dataSource != null && !dataSource.MaskedKeys.Contains(key))
			{
				dataSource.MaskKey(key);
			}
		}

		void IDataSourceProvider.UnmaskKey(string key)
		{
			_maskedKeys.Remove(key);
			DataSource?.UnmaskKey(key);
		}

		static void OnDataSourceChanged(BindableObject bindable, object oldValue, object newValue)
		{
			var dataView = (DataView)bindable;
			var dataSource = (IDataSource)newValue;
			var oldSource = (IDataSource)oldValue;

			if (oldSource != null)
			{
				foreach (string key in dataView._maskedKeys)
					oldSource.UnmaskKey(key);
			}

			if (dataSource != null)
			{
				foreach (string key in dataView._maskedKeys)
				{
					dataSource.MaskKey(key);
				}
			}
		}
	}
}