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 Version
+
2021.1.413.1
+
+
+
Product
+
ListView 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 Version
+
2020.1 218.1
+
+
+
Product
+
Popup 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+and the code for opening the popup:
+
+```C#
+private void Button_Clicked(object sender, EventArgs e)
+{
+ this.popup.IsOpen = true;
+}
+```
+
+
+the code for closing the popup:
+
+```C#
+private void Button_Clicked1(object sender, EventArgs e)
+{
+ this.popup.IsOpen = false;
+}
+```
\ No newline at end of file