Browse Source

Update selected context when selected index changes

pull/3186/head
Benedikt Schroeder 7 years ago
parent
commit
b20f3f4cdf
  1. 2
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  2. 59
      src/Avalonia.Controls/TabControl.cs
  3. 19
      src/Avalonia.Controls/TabItem.cs

2
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -358,7 +358,7 @@ namespace Avalonia.Controls.Primitives
{ {
if ((container.ContainerControl as ISelectable)?.IsSelected == true) if ((container.ContainerControl as ISelectable)?.IsSelected == true)
{ {
if (SelectedIndex == -1) if (SelectionMode.HasFlag(SelectionMode.Single))
{ {
SelectedIndex = container.Index; SelectedIndex = container.Index;
} }

59
src/Avalonia.Controls/TabControl.cs

@ -70,6 +70,7 @@ namespace Avalonia.Controls
SelectionModeProperty.OverrideDefaultValue<TabControl>(SelectionMode.AlwaysSelected); SelectionModeProperty.OverrideDefaultValue<TabControl>(SelectionMode.AlwaysSelected);
ItemsPanelProperty.OverrideDefaultValue<TabControl>(DefaultPanel); ItemsPanelProperty.OverrideDefaultValue<TabControl>(DefaultPanel);
AffectsMeasure<TabControl>(TabStripPlacementProperty); AffectsMeasure<TabControl>(TabStripPlacementProperty);
SelectedIndexProperty.Changed.AddClassHandler<TabControl>((x, e) => x.UpdateSelectedContent(e));
} }
/// <summary> /// <summary>
@ -145,6 +146,64 @@ namespace Avalonia.Controls
return RegisterContentPresenter(presenter); return RegisterContentPresenter(presenter);
} }
private void UpdateSelectedContent(AvaloniaPropertyChangedEventArgs e)
{
var index = (int)e.NewValue;
if (index == -1)
{
SelectedContentTemplate = null;
SelectedContent = null;
return;
}
var container = (TabItem)ItemContainerGenerator.ContainerFromIndex(index);
if (container == null)
{
if (Items is AvaloniaList<object> items)
{
container = items[index] as TabItem;
}
}
if (container == null)
{
return;
}
UpdateSelectedContent(container);
}
private void UpdateSelectedContent(TabItem item)
{
if (SelectedContentTemplate != item.ContentTemplate)
{
SelectedContentTemplate = item.ContentTemplate;
}
if (SelectedContent != item.Content)
{
SelectedContent = item.Content;
}
}
protected override Size MeasureOverride(Size availableSize)
{
var size = base.MeasureOverride(availableSize);
if (SelectedIndex != -1 && SelectedContent == null)
{
var container = (TabItem)ItemContainerGenerator.ContainerFromIndex(SelectedIndex);
UpdateSelectedContent(container);
}
return size;
}
/// <summary> /// <summary>
/// Called when an <see cref="IContentPresenter"/> is registered with the control. /// Called when an <see cref="IContentPresenter"/> is registered with the control.
/// </summary> /// </summary>

19
src/Avalonia.Controls/TabItem.cs

@ -30,7 +30,6 @@ namespace Avalonia.Controls
{ {
SelectableMixin.Attach<TabItem>(IsSelectedProperty); SelectableMixin.Attach<TabItem>(IsSelectedProperty);
FocusableProperty.OverrideDefaultValue(typeof(TabItem), true); FocusableProperty.OverrideDefaultValue(typeof(TabItem), true);
IsSelectedProperty.Changed.AddClassHandler<TabItem>((x, e) => x.UpdateSelectedContent(e));
DataContextProperty.Changed.AddClassHandler<TabItem>((x, e) => x.UpdateHeader(e)); DataContextProperty.Changed.AddClassHandler<TabItem>((x, e) => x.UpdateHeader(e));
} }
@ -83,23 +82,5 @@ namespace Avalonia.Controls
} }
} }
} }
private void UpdateSelectedContent(AvaloniaPropertyChangedEventArgs e)
{
if (!IsSelected)
{
return;
}
if (ParentTabControl.SelectedContentTemplate != ContentTemplate)
{
ParentTabControl.SelectedContentTemplate = ContentTemplate;
}
if (ParentTabControl.SelectedContent != Content)
{
ParentTabControl.SelectedContent = Content;
}
}
} }
} }

Loading…
Cancel
Save