Attempts to get horizontal list to work

This commit is contained in:
watsonb8
2019-07-10 17:17:10 -04:00
parent 823e1341ca
commit c99f752174
6 changed files with 190 additions and 125 deletions

View File

@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows.Input;
using Xamarin.Forms;
@ -13,6 +14,7 @@ namespace Aurora.Design.Components.HorizontalList
private readonly StackLayout _itemsStackLayout;
public event EventHandler SelectedItemChanged;
private NotifyCollectionChangedEventHandler _itemsChangedHandler;
public StackOrientation ListOrientation { get; set; }
@ -22,7 +24,12 @@ namespace Aurora.Design.Components.HorizontalList
BindableProperty.Create("SelectedCommand", typeof(ICommand), typeof(HorizontalList), null);
public static readonly BindableProperty ItemsSourceProperty =
BindableProperty.Create("ItemsSource", typeof(IEnumerable), typeof(HorizontalList), default(IEnumerable<object>), BindingMode.TwoWay, propertyChanged: ItemsSourceChanged);
BindableProperty.Create("ItemsSource",
typeof(ObservableCollection<object>),
typeof(HorizontalList),
default(ObservableCollection<object>),
BindingMode.TwoWay,
propertyChanged: ItemsSourceChanged);
public static readonly BindableProperty SelectedItemProperty =
BindableProperty.Create("SelectedItem", typeof(object), typeof(HorizontalList), null, BindingMode.TwoWay, propertyChanged: OnSelectedItemChanged);
@ -36,9 +43,9 @@ namespace Aurora.Design.Components.HorizontalList
set { SetValue(SelectedCommandProperty, value); }
}
public IEnumerable ItemsSource
public ObservableCollection<object> ItemsSource
{
get { return (IEnumerable)GetValue(ItemsSourceProperty); }
get { return (ObservableCollection<object>)GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); }
}
@ -56,12 +63,13 @@ namespace Aurora.Design.Components.HorizontalList
private static void ItemsSourceChanged(BindableObject bindable, object oldValue, object newValue)
{
var itemsLayout = (HorizontalList)bindable;
HorizontalList itemsLayout = bindable as HorizontalList;
itemsLayout.SetItems();
}
public HorizontalList()
{
_itemsChangedHandler = OnItemsChanged;
// BackgroundColor = Color.FromHex("#1E2634");
Spacing = 6;
_scrollView = new ScrollView();
@ -78,6 +86,11 @@ namespace Aurora.Design.Components.HorizontalList
Children.Add(_scrollView);
}
~HorizontalList()
{
ItemsSource.CollectionChanged -= _itemsChangedHandler;
}
protected virtual void SetItems()
{
_itemsStackLayout.Children.Clear();
@ -99,6 +112,9 @@ namespace Aurora.Design.Components.HorizontalList
return;
}
//Setup collection events
ItemsSource.CollectionChanged += _itemsChangedHandler;
foreach (var item in ItemsSource)
{
_itemsStackLayout.Children.Add(GetItemView(item));
@ -127,7 +143,6 @@ namespace Aurora.Design.Components.HorizontalList
};
AddGesture(view, gesture);
return view;
}
@ -164,5 +179,33 @@ namespace Aurora.Design.Components.HorizontalList
itemsView.SelectedCommand?.Execute(newValue);
}
}
private void OnItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
{
foreach (object item in e.NewItems)
{
_itemsStackLayout.Children.Add(GetItemView(item));
}
break;
}
case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
{
foreach (object item in e.OldItems)
{
//Clear layout and rebuild
_itemsStackLayout.Children.Clear();
foreach (var source in ItemsSource)
{
_itemsStackLayout.Children.Add(GetItemView(item));
}
}
break;
}
}
}
}
}

View File

@ -57,7 +57,7 @@ namespace Aurora.Design.Components.MemberList
if (membersList != null)
{
_newSource = newValue as ObservableCollection<PartyMember>;
membersList.ItemsSource = newValue as ObservableCollection<PartyMember>;
membersList.ItemsSource = newValue as ObservableCollection<object>;
}
}
}

View File

@ -3,7 +3,8 @@
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:hs="clr-namespace:Aurora.Design.Components.HostSelector"
xmlns:ml="clr-namespace:Aurora.Design.Components.MemberList"
xmlns:hl="clr-namespace:Aurora.Design.Components.HorizontalList"
xmlns:renderedViews="clr-namespace:Sharpnado.Presentation.Forms.RenderedViews;assembly=Sharpnado.Presentation.Forms"
xmlns:qu="clr-namespace:Aurora.Design.Components.Queue"
x:Class="Aurora.Design.Views.Party.PartyView">
<ContentView.Content>
@ -17,9 +18,20 @@
IsVisible="{Binding IsNotSelectingHost}">
<Label
Text="Party Members"/>
<ml:MemberList
VerticalOptions="FillAndExpand"
Members="{Binding Members}"/>
<hl:HorizontalList
x:Name="MembersHorizontalList"
ListOrientation="Horizontal"
VerticalOptions="Start"
ItemsSource="{Binding Members}">
<hl:HorizontalList.ItemTemplate>
<DataTemplate>
<Frame>
<Label
Text="{Binding UserName}"/>
</Frame>
</DataTemplate>
</hl:HorizontalList.ItemTemplate>
</hl:HorizontalList>
<Label
Text="Queue"/>
<qu:Queue/>

View File

@ -28,7 +28,11 @@ namespace Aurora.Design.Views.Party
{
this.JoinCommand = new Command(OnJoinExecute, CanJoinExecute);
this.HostCommand = new Command(OnHostExecute, CanHostExecute);
_members = new ObservableCollection<PartyMember>();
_members = new ObservableCollection<PartyMember>
{
new PartyMember{UserName = "asdf"}
};
State(PartyState.SelectingHost);
}
@ -49,7 +53,10 @@ namespace Aurora.Design.Views.Party
{
return _members;
}
set { SetProperty(ref _members, value); }
set
{
SetProperty(ref _members, value);
}
}
public bool IsSelectingHost
@ -87,7 +94,8 @@ namespace Aurora.Design.Views.Party
_executor = BaseExecutor.CreateExecutor<ClientExecutor>();
_executor.Connect(this.Hostname);
SetUpMembers();
SetupMembersCollection();
OnPropertyChanged("Members");
State(PartyState.Connecting);
}
@ -104,7 +112,8 @@ namespace Aurora.Design.Views.Party
_executor = BaseExecutor.CreateExecutor<HostExecutor>();
_executor.Connect(this.Hostname);
SetUpMembers();
SetupMembersCollection();
OnPropertyChanged("Members");
//Change state
State(PartyState.Connecting);
@ -118,18 +127,41 @@ namespace Aurora.Design.Views.Party
#endregion Commands
private void SetUpMembers()
private void SetupMembersCollection()
{
_members = _executor.PartyMembers;
OnPropertyChanged("Members");
_executor.PartyMembers.CollectionChanged += (sender, e) =>
if (_executor != null)
{
if (_executor != null)
foreach (PartyMember member in _executor.PartyMembers)
{
_members = _executor.PartyMembers;
_members.Add(member);
}
OnPropertyChanged("Members");
};
//Setup events
_executor.PartyMembers.CollectionChanged += (sender, e) =>
{
switch (e.Action)
{
case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
{
foreach (PartyMember member in e.NewItems)
{
Members.Add(member);
OnPropertyChanged("Members");
}
break;
}
case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
{
foreach (PartyMember member in e.OldItems)
{
Members.Remove(member);
OnPropertyChanged("Members");
}
break;
}
}
};
}
}
}
}