diff --git a/knowledge-base/listview-select-items-from-group-header.md b/knowledge-base/listview-select-items-from-group-header.md new file mode 100644 index 00000000..9d11f8cb --- /dev/null +++ b/knowledge-base/listview-select-items-from-group-header.md @@ -0,0 +1,344 @@ +--- +title: Select items from a checkbox in the group header +description: select all items in the group from the group header +type: how-to +page_title: Select listview items from a checkbox in the group header +slug: listview-select-items-from-group-header +position: +tags: +ticketid: 1539965 +res_type: kb +--- + +## Environment + + + + + + + + + + + +
Product Version2021.1.413.1
ProductListView for Xamarin Cross-Platform
+ + +## Description + +This article will show you how to select all items from a group uisng checkbox in the groupo header. + +## Solution + +You can create a [GroupHeaderTemplate]({%slug listview-features-grouping%}#groupheadertemplate) and inside it place a CheckBox control with a Command handled in the ViewModel, basically through an EventToCommandBehavior you can subscribe to the IsCheckedChanged event and implement the needed logic for checking/unchecking the group child items. + +ListView definition in XAML. The CheckBox control is added inside the GroupHeaderTemplate: + +```XAML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +The ViewModel and business model used: + +```C# +public class ViewModel +{ + public ObservableCollection Cities { get; set; } + + public ObservableCollection SelectedGroupKeys { get; set; } + public ViewModel() + { + this.Cities = new ObservableCollection() + { + new City() { Name = "Barcelona", Country = "Spain"}, + new City() { Name = "Madrid", Country = "Spain"}, + new City() { Name = "Rome", Country = "Italy"}, + new City() { Name = "Florence", Country = "Italy"}, + new City() { Name = "London", Country = "England"}, + new City() { Name = "Manchester", Country = "England"}, + new City() { Name = "New York", Country = "USA"}, + new City() { Name = "Boston", Country = "USA"} + }; + + this.IsCheckedChangedCommand = new Command(this.IsCheckedChangedCommandExecute); + this.SelectedGroupKeys = new ObservableCollection(); + } + + public ICommand IsCheckedChangedCommand { get; private set; } + + private void IsCheckedChangedCommandExecute(object param) + { + var currentGroupkey = (string) (param as GroupHeaderContext).Key; + var childitems = (param as GroupHeaderContext).Items; + bool shouldBeSelected; + + if (this.SelectedGroupKeys.Contains(currentGroupkey)) + { + this.SelectedGroupKeys.Remove(currentGroupkey); + + shouldBeSelected = false; + } + else + { + this.SelectedGroupKeys.Add(currentGroupkey); + shouldBeSelected = true; + } + + foreach(City city in this.Cities.Where(c => c.Country == currentGroupkey).ToList()) + { + city.IsSelected = shouldBeSelected; + } + + } +} + +public class City: NotifyPropertyChangedBase +{ + private bool isSelected; + public string Name { get; set; } + public string Country { get; set; } + + public bool IsSelected + { + get { return this.isSelected; } + set + { + if(this.isSelected != value) + { + this.isSelected = value; + this.OnPropertyChanged(); + } + } + } +} +``` + +Set the `BindingContex`t after `InitializeComponent()`: + +```C# +this.BindingContext = new ViewModel(); +``` + +EventToCommand behavior implementation: + +Create a BehaviorBase + +```C# +public class BehaviorBase : Behavior where T : BindableObject +{ + public T AssociatedObject { get; private set; } + + protected override void OnAttachedTo(T bindable) + { + base.OnAttachedTo(bindable); + AssociatedObject = bindable; + + if (bindable.BindingContext != null) + { + BindingContext = bindable.BindingContext; + } + + bindable.BindingContextChanged += OnBindingContextChanged; + } + + protected override void OnDetachingFrom(T bindable) + { + base.OnDetachingFrom(bindable); + bindable.BindingContextChanged -= OnBindingContextChanged; + AssociatedObject = null; + } + + void OnBindingContextChanged(object sender, EventArgs e) + { + OnBindingContextChanged(); + } + + protected override void OnBindingContextChanged() + { + base.OnBindingContextChanged(); + BindingContext = AssociatedObject.BindingContext; + } +} +``` + +Create a class EventToCommandBehavior which inherits from BehaviorBase + +```C# +public class EventToCommandBehavior : BehaviorBase +{ + Delegate eventHandler; + + public static readonly BindableProperty EventNameProperty = BindableProperty.Create("EventName", typeof(string), typeof(EventToCommandBehavior), null, propertyChanged: OnEventNameChanged); + public static readonly BindableProperty CommandProperty = BindableProperty.Create("Command", typeof(ICommand), typeof(EventToCommandBehavior), null); + public static readonly BindableProperty CommandParameterProperty = BindableProperty.Create("CommandParameter", typeof(object), typeof(EventToCommandBehavior), null); + public static readonly BindableProperty InputConverterProperty = BindableProperty.Create("Converter", typeof(IValueConverter), typeof(EventToCommandBehavior), null); + + public string EventName + { + get { return (string)GetValue(EventNameProperty); } + set { SetValue(EventNameProperty, value); } + } + + public ICommand Command + { + get { return (ICommand)GetValue(CommandProperty); } + set { SetValue(CommandProperty, value); } + } + + public object CommandParameter + { + get { return GetValue(CommandParameterProperty); } + set { SetValue(CommandParameterProperty, value); } + } + + public IValueConverter Converter + { + get { return (IValueConverter)GetValue(InputConverterProperty); } + set { SetValue(InputConverterProperty, value); } + } + + protected override void OnAttachedTo(VisualElement bindable) + { + base.OnAttachedTo(bindable); + RegisterEvent(EventName); + } + + protected override void OnDetachingFrom(VisualElement bindable) + { + DeregisterEvent(EventName); + base.OnDetachingFrom(bindable); + } + + void RegisterEvent(string name) + { + if (string.IsNullOrWhiteSpace(name)) + { + return; + } + + EventInfo eventInfo = AssociatedObject.GetType().GetRuntimeEvent(name); + if (eventInfo == null) + { + throw new ArgumentException(string.Format("EventToCommandBehavior: Can't register the '{0}' event.", EventName)); + } + MethodInfo methodInfo = typeof(EventToCommandBehavior).GetTypeInfo().GetDeclaredMethod("OnEvent"); + eventHandler = methodInfo.CreateDelegate(eventInfo.EventHandlerType, this); + eventInfo.AddEventHandler(AssociatedObject, eventHandler); + } + + void DeregisterEvent(string name) + { + if (string.IsNullOrWhiteSpace(name)) + { + return; + } + + if (eventHandler == null) + { + return; + } + EventInfo eventInfo = AssociatedObject.GetType().GetRuntimeEvent(name); + if (eventInfo == null) + { + throw new ArgumentException(string.Format("EventToCommandBehavior: Can't de-register the '{0}' event.", EventName)); + } + eventInfo.RemoveEventHandler(AssociatedObject, eventHandler); + eventHandler = null; + } + + void OnEvent(object sender, object eventArgs) + { + if (Command == null) + { + return; + } + + object resolvedParameter; + if (CommandParameter != null) + { + resolvedParameter = CommandParameter; + } + else if (Converter != null) + { + resolvedParameter = Converter.Convert(eventArgs, typeof(object), null, null); + } + else + { + resolvedParameter = eventArgs; + } + + if (Command.CanExecute(resolvedParameter)) + { + Command.Execute(resolvedParameter); + } + } + + static void OnEventNameChanged(BindableObject bindable, object oldValue, object newValue) + { + var behavior = (EventToCommandBehavior)bindable; + if (behavior.AssociatedObject == null) + { + return; + } + + string oldEventName = (string)oldValue; + string newEventName = (string)newValue; + + behavior.DeregisterEvent(oldEventName); + behavior.RegisterEvent(newEventName); + } +} +``` \ No newline at end of file diff --git a/knowledge-base/popup-position-center.md b/knowledge-base/popup-position-center.md new file mode 100644 index 00000000..368ba42c --- /dev/null +++ b/knowledge-base/popup-position-center.md @@ -0,0 +1,100 @@ +--- +title: Popup placement center +description: how to position the popup in the center of the page +type: how-to +page_title: position popup in the center of the page +slug: popup-position-center +position: +tags: +ticketid: 1454630 +res_type: kb +--- + +## Environment + + + + + + + + + + + +
Product Version2020.1 218.1
ProductPopup for Xamarin
+ + +## Description + +Thi article shows how to positiont he popup in the center of the page + +## Solution + +The popup could be attached to the page or contentview. In addition the popup placement target must be the page or the contentview. + +Here is an example how to set Popup Placement Target to be the page: + +```XAML + + + +