summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla47971.cs
blob: 351028d4a70bc6576f5c1f052841da7f3cd7d77c (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
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;

namespace Xamarin.Forms.Controls.Issues
{
	[Preserve(AllMembers = true)]
	[Issue(IssueTracker.Bugzilla, 47971, "UWP doesn't display list items when binding a CommandParameter to BindingContext in a DataTemplate and including a CanExecute method", PlatformAffected.WinRT)]
	public class Bugzilla47971 : TestContentPage
	{
		protected override void Init()
		{
			var viewModel = new _47971ViewModel();

			var lv = new ListView { BindingContext = viewModel };

			lv.SetBinding(ListView.ItemsSourceProperty, new Binding("Models"));
			lv.SetBinding(ListView.SelectedItemProperty, new Binding("SelectedModel"));

			lv.ItemTemplate = new DataTemplate(() =>
			{
				var tc = new TextCell();

				tc.SetBinding(TextCell.TextProperty, new Binding("Name"));
				tc.SetBinding(TextCell.CommandParameterProperty, new Binding("."));
				tc.SetBinding(TextCell.CommandProperty, new Binding("BindingContext.ModelSelectedCommand", source: lv));

				return tc;
			});

			var layout = new StackLayout { Spacing = 10 };
			var instructions = new Label {Text = "The ListView below should display three items (Item1, Item2, and Item3). If it does not, this test has failed." };

			layout.Children.Add(instructions);
			layout.Children.Add(lv);

			Content = layout;
		}

		[Preserve(AllMembers = true)]
		internal class _47971ViewModel : INotifyPropertyChanged
		{
			_47971ItemModel _selectedModel;
			Command<_47971ItemModel> _modelSelectedCommand;
			ObservableCollection<_47971ItemModel> _models;

			public ObservableCollection<_47971ItemModel> Models
			{
				get { return _models; }
				set
				{
					_models = value;
					OnPropertyChanged();
				}
			}

			public _47971ItemModel SelectedModel
			{
				get { return _selectedModel; }
				set
				{
					_selectedModel = value;
					OnPropertyChanged();
				}
			}

			public Command<_47971ItemModel> ModelSelectedCommand => _modelSelectedCommand ??
				(_modelSelectedCommand = new Command<_47971ItemModel>(ModelSelectedCommandExecute, CanExecute));

			bool CanExecute(_47971ItemModel itemModel)
			{
				return true;
			}

			void ModelSelectedCommandExecute(_47971ItemModel model)
			{
				System.Diagnostics.Debug.WriteLine(model.Name);
			}

			public _47971ViewModel()
			{
				_models = new ObservableCollection<_47971ItemModel>(
					new List<_47971ItemModel>()
					{
						new _47971ItemModel() { Name = "Item 1"},
						new _47971ItemModel() { Name = "Item 2"},
						new _47971ItemModel() { Name = "Item 3"}
					});
			}

			public event PropertyChangedEventHandler PropertyChanged;

			protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
			{
				PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
			}
		}

		[Preserve(AllMembers = true)]
		internal class _47971ItemModel
		{
			public string Name { get; set; }
		}
	}
}