3 using System.Collections;
4 using System.Collections.Generic;
5 using System.Collections.Specialized;
6 using System.ComponentModel;
7 using Tizen.Xamarin.Forms.Extension;
8 using Tizen.Xamarin.Forms.Extension.Renderer;
10 using Xamarin.Forms.Platform.Tizen;
11 using TForms = Xamarin.Forms.Platform.Tizen.Forms;
13 [assembly: ExportRenderer(typeof(DropdownList), typeof(DropdownListRenderer))]
15 namespace Tizen.Xamarin.Forms.Extension.Renderer
17 public class DropdownListRenderer : ViewRenderer<DropdownList, Hoversel>
19 class DropdownItem : BindableObject
21 public static readonly BindableProperty TextProperty = BindableProperty.Create("Text", typeof(string), typeof(DropdownItem), default(string));
25 get { return (string)GetValue(TextProperty); }
26 set { SetValue(TextProperty, value); }
29 public HoverselItem HoverselItem { get; set; }
30 public object Data { get; set; }
33 Dictionary<HoverselItem, DropdownItem> _items = new Dictionary<HoverselItem, DropdownItem>();
34 Dictionary<object, DropdownItem> _objectMap = new Dictionary<object, DropdownItem>();
35 object _selectedItem = null;
37 protected override void OnElementChanged(ElementChangedEventArgs<DropdownList> e)
41 var dropdownList = new Hoversel((TForms.Context as FormsApplication).MainWindow);
42 SetNativeControl(dropdownList);
43 Control.ItemSelected += OnHoverselItemSelected;
44 Control.Dismissed += OnDismissed;
45 Control.Expanded += OnExpanded;
47 if (e.OldElement != null)
49 e.OldElement.ExpandChangeRequested -= OnExpandChangeRequested;
50 e.OldElement.CollectionChanged -= OnCollectionChanged;
53 if (e.NewElement != null)
55 e.NewElement.ExpandChangeRequested += OnExpandChangeRequested;
56 e.NewElement.CollectionChanged += OnCollectionChanged;
57 Control.HoverParent = (TForms.Context as FormsApplication).MainWindow;
59 AddItems(e.NewElement.ItemsSource);
63 base.OnElementChanged(e);
66 void OnHoverselItemSelected(object sender, HoverselItemEventArgs e)
68 Element.SelectedItem = GetItem(e.Item)?.Data;
71 void OnExpanded(object sender, EventArgs e)
73 Element?.SetValue(DropdownList.IsExpandedPropertyKey, true);
76 void OnDismissed(object sender, EventArgs e)
78 Element?.SetValue(DropdownList.IsExpandedPropertyKey, false);
81 protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
83 if (e.PropertyName == DropdownList.IsExpandedProperty.PropertyName)
87 else if (e.PropertyName == DropdownList.DisplayMemberPathProperty.PropertyName)
89 UpdateDisplayMemberPath();
91 else if (e.PropertyName == DropdownList.SelectedItemProperty.PropertyName)
95 else if (e.PropertyName == DropdownList.ItemsSourceProperty.PropertyName)
99 base.OnElementPropertyChanged(sender, e);
102 void UpdateItemSource()
105 AddItems(Element.ItemsSource);
108 void UpdateIsExpanded()
110 if (Element.IsExpanded)
112 Control.HoverBegin();
120 void UpdateSelectedItem()
122 _selectedItem = Element.SelectedItem;
123 DropdownItem item = GetItem(Element.SelectedItem);
126 Element.SelectedItem = null;
127 Control.Text = string.Empty;
131 Control.Text = item.Text;
135 void OnExpandChangeRequested(object sender, DropdownList.ExpandRequestArgs e)
139 Control.HoverBegin();
147 void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
149 if (e.NewItems != null)
151 AddItems(e.NewItems);
153 if (e.OldItems != null)
155 RemoveItems(e.OldItems);
157 if (e.Action == NotifyCollectionChangedAction.Reset)
163 void AddItems(IEnumerable items)
165 foreach (object item in items)
167 DropdownItem dropdownItem = new DropdownItem()
171 if (!string.IsNullOrEmpty(Element.DisplayMemberPath))
173 dropdownItem.SetBinding(DropdownItem.TextProperty, new Binding(Element.DisplayMemberPath));
177 dropdownItem.Text = item.ToString();
179 dropdownItem.BindingContext = item;
180 dropdownItem.HoverselItem = Control.AddItem(dropdownItem.Text);
181 dropdownItem.PropertyChanged += OnDropdownItemTextChanged;
182 _items[dropdownItem.HoverselItem] = dropdownItem;
183 _objectMap[item] = dropdownItem;
187 void OnDropdownItemTextChanged(object sender, PropertyChangedEventArgs e)
189 if (e.PropertyName == DropdownItem.TextProperty.PropertyName)
191 DropdownItem item = (DropdownItem)sender;
192 item.HoverselItem?.SetPartText("default", item.Text);
193 if (_selectedItem == item.Data)
195 Control.Text = item.Text;
200 void UpdateDisplayMemberPath()
202 foreach (var item in _items.Values)
204 if (!string.IsNullOrEmpty(Element.DisplayMemberPath))
206 item.SetBinding(DropdownItem.TextProperty, new Binding(Element.DisplayMemberPath));
210 item.Text = item.Data.ToString();
213 UpdateSelectedItem();
216 void RemoveItems(IEnumerable items)
218 foreach (object item in items)
220 var dropdownItem = GetItem(item);
221 if (Element.SelectedItem == dropdownItem.Data)
223 Element.SelectedItem = null;
225 dropdownItem.PropertyChanged -= OnDropdownItemTextChanged;
226 _items.Remove(dropdownItem.HoverselItem);
227 _objectMap.Remove(item);
228 dropdownItem.HoverselItem.Delete();
238 Element.SelectedItem = null;
241 DropdownItem GetItem(object obj)
245 DropdownItem item = null;
246 _objectMap.TryGetValue(obj, out item);
250 DropdownItem GetItem(HoverselItem selItem)
254 DropdownItem item = null;
255 _items.TryGetValue(selItem, out item);