+using ElmSharp;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
+using System.Reflection;
using Tizen.Xamarin.Forms.Extension;
using Tizen.Xamarin.Forms.Extension.Renderer;
using Xamarin.Forms.Platform.Tizen;
-using EHoversel = ElmSharp.Hoversel;
using TForms = Xamarin.Forms.Platform.Tizen.Forms;
[assembly: ExportRenderer(typeof(DropdownList), typeof(DropdownListRenderer))]
namespace Tizen.Xamarin.Forms.Extension.Renderer
{
- public class DropdownListRenderer : ViewRenderer<DropdownList, EHoversel>
+ public class DropdownListRenderer : ViewRenderer<DropdownList, Hoversel>
{
- Dictionary<ElmSharp.HoverselItem, object> _items = new Dictionary<ElmSharp.HoverselItem, object>();
-
- public DropdownListRenderer()
- {
- }
+ Dictionary<HoverselItem, object> _items = new Dictionary<HoverselItem, object>();
protected override void OnElementChanged(ElementChangedEventArgs<DropdownList> e)
{
if (Control == null)
{
- var dropdownList = new EHoversel(TForms.Context.MainWindow);
+ var dropdownList = new Hoversel(TForms.Context.MainWindow);
SetNativeControl(dropdownList);
}
if (e.OldElement != null)
Control.HoverParent = Platform.GetRenderer(Element.Parent)?.NativeView;
- ClearItems();
AddItems(e.NewElement.InternalItems);
UpdateIsHorizontal();
UpdateIsExpanded();
+ UpdateText();
}
base.OnElementChanged(e);
}
- void ItemSelectedEventHandler(object sender, ElmSharp.HoverselItemEventArgs e)
+ void ItemSelectedEventHandler(object sender, HoverselItemEventArgs e)
{
Element.SelectedItem = _items[e.Item];
}
Element.IsExpanded = false;
}
+ bool IsPrimitive()
+ {
+ string displayMemberPath = Element.DisplayMemberPath;
+ if (string.IsNullOrEmpty(displayMemberPath) || string.IsNullOrWhiteSpace(displayMemberPath))
+ {
+ return true;
+ }
+ object itemsSourceObj = Element.ItemsSource.OfType<object>().FirstOrDefault();
+ var typeInfo = itemsSourceObj.GetType().GetTypeInfo();
+ if (typeInfo.IsVisible || typeInfo.IsPrimitive || typeInfo.IsValueType)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ string GetDisplayMember(object item)
+ {
+ if(IsPrimitive())
+ {
+ return item.ToString();
+ }
+
+ var propertyPathParts = Element.DisplayMemberPath.Split('.');
+ object propertyValue = item;
+ foreach (var propertyPathPart in propertyPathParts)
+ {
+ var propInfo = propertyValue.GetType().GetTypeInfo().GetDeclaredProperty(propertyPathPart);
+ if (propInfo == null)
+ {
+ // No Property was found
+ return item.ToString();
+ }
+ propertyValue = propInfo.GetValue(propertyValue);
+ }
+ if (propertyValue == null)
+ {
+ // No Property was found
+ return item.ToString();
+ }
+ return propertyValue.ToString();
+ }
+
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == DropdownList.IsHorizontalProperty.PropertyName)
{
UpdateIsExpanded();
}
+ else if (e.PropertyName == DropdownList.DisplayMemberPathProperty.PropertyName)
+ {
+ UpdateElementItems(_items);
+ }
else if (e.PropertyName == DropdownList.SelectedItemProperty.PropertyName)
{
UpdateText();
void UpdateText()
{
- Control.Text = Element.SelectedItem != null ? Element.SelectedItem.ToString() : string.Empty;
+ Control.Text = Element.SelectedItem != null ? GetDisplayMember(Element.SelectedItem) : string.Empty;
}
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
foreach (object item in items)
{
- _items.Add(Control.AddItem(item.ToString()), item);
+ if (item is INotifyPropertyChanged)
+ {
+ ((INotifyPropertyChanged)item).PropertyChanged -= OnItemPropertyChanged;
+ ((INotifyPropertyChanged)item).PropertyChanged += OnItemPropertyChanged;
+ }
+ _items.Add(Control.AddItem(GetDisplayMember(item)), item);
+ }
+ }
+
+ private void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ if (Element.DisplayMemberPath == e.PropertyName)
+ {
+ UpdateElementItems(_items.Where(p => p.Value == sender));
+ }
+ }
+
+ void UpdateElementItems(IEnumerable<KeyValuePair<HoverselItem, object>> items)
+ {
+ foreach (var target in items)
+ {
+ target.Key.SetPartText("default", GetDisplayMember(target.Value));
}
+ UpdateText();
}
void RemoveItems(IEnumerable items)
foreach (object item in items)
{
var target = _items.Where(d => d.Value == item).ToList();
- if (target.Count == 1)
+ if (target.Count == 1 && (target[0].Value == Element.SelectedItem))
{
Element.SelectedItem = null;
+ if (item is INotifyPropertyChanged)
+ ((INotifyPropertyChanged)item).PropertyChanged -= OnItemPropertyChanged;
}
_items.Remove(target[0].Key);
target[0].Key.Delete();
using System.Collections;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
-using System.Reflection;
using Xamarin.Forms;
namespace Tizen.Xamarin.Forms.Extension
/// <summary>
/// BindableProperty. Identifies the DisplayMemberPath bindable property.
/// </summary>
- public static readonly BindableProperty DisplayMemberPathProperty = BindableProperty.Create("DisplayMemberPath", typeof(string), typeof(DropdownList), default(string), propertyChanged: OnDisplayMemberPathChanged);
+ public static readonly BindableProperty DisplayMemberPathProperty = BindableProperty.Create("DisplayMemberPath", typeof(string), typeof(DropdownList), default(string));
/// <summary>
/// Occurs when an item in the DropdownList is selected.
ObservableCollection<object> _items = new ObservableCollection<object>();
- public DropdownList()
- {
- }
-
/// <summary>
/// Gets or sets the currently selected item from the DropdownList.ItemsSource.
/// </summary>
void AddItems(NotifyCollectionChangedEventArgs e)
{
foreach (object newItem in e.NewItems)
- _items.Add(GetDisplayMember(newItem));
+ _items.Add(newItem);
}
void RemoveItems(NotifyCollectionChangedEventArgs e)
_items.Clear();
foreach (object item in ItemsSource)
- _items.Add(GetDisplayMember(item));
- }
-
- object GetDisplayMember(object item)
- {
- if (string.IsNullOrEmpty(DisplayMemberPath) || string.IsNullOrWhiteSpace(DisplayMemberPath))
- return item.ToString();
-
- PropertyInfo prop = item.GetType().GetRuntimeProperty(DisplayMemberPath);
-
- if (prop == null)
- return item.ToString();
-
- return prop.GetValue(item);
+ _items.Add(item);
}
static object OnCoerceSelectedItem(BindableObject bindable, object value)
static void OnSelectedItemChanged(BindableObject bindable, object oldValue, object newValue)
{
- var dropdownList = bindable as DropdownList;
- if (oldValue != newValue)
- dropdownList.ItemSelected?.Invoke(bindable as DropdownList, new SelectedItemChangedEventArgs(newValue));
- }
-
- static void OnDisplayMemberPathChanged(BindableObject bindable, object oldValue, object newValue)
- {
- var dropdownList = bindable as DropdownList;
- dropdownList.ResetItems();
+ var dropdownList = (DropdownList)bindable;
+ dropdownList.ItemSelected?.Invoke(bindable, new SelectedItemChangedEventArgs(newValue));
}
}
-}
\ No newline at end of file
+}