|
|
@@ -3,8 +3,10 @@
|
|
|
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
using Avalonia.Controls.Templates;
|
|
|
using Avalonia.Data;
|
|
|
+using Avalonia.LogicalTree;
|
|
|
|
|
|
namespace Avalonia.Controls.Generators
|
|
|
{
|
|
|
@@ -15,6 +17,8 @@ namespace Avalonia.Controls.Generators
|
|
|
public class TreeItemContainerGenerator<T> : ItemContainerGenerator<T>, ITreeItemContainerGenerator
|
|
|
where T : class, IControl, new()
|
|
|
{
|
|
|
+ private TreeView _treeView;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Initializes a new instance of the <see cref="TreeItemContainerGenerator{T}"/> class.
|
|
|
/// </summary>
|
|
|
@@ -23,31 +27,28 @@ namespace Avalonia.Controls.Generators
|
|
|
/// <param name="contentTemplateProperty">The container's ContentTemplate property.</param>
|
|
|
/// <param name="itemsProperty">The container's Items property.</param>
|
|
|
/// <param name="isExpandedProperty">The container's IsExpanded property.</param>
|
|
|
- /// <param name="index">The container index for the tree</param>
|
|
|
public TreeItemContainerGenerator(
|
|
|
IControl owner,
|
|
|
AvaloniaProperty contentProperty,
|
|
|
AvaloniaProperty contentTemplateProperty,
|
|
|
AvaloniaProperty itemsProperty,
|
|
|
- AvaloniaProperty isExpandedProperty,
|
|
|
- TreeContainerIndex index)
|
|
|
+ AvaloniaProperty isExpandedProperty)
|
|
|
: base(owner, contentProperty, contentTemplateProperty)
|
|
|
{
|
|
|
Contract.Requires<ArgumentNullException>(owner != null);
|
|
|
Contract.Requires<ArgumentNullException>(contentProperty != null);
|
|
|
Contract.Requires<ArgumentNullException>(itemsProperty != null);
|
|
|
Contract.Requires<ArgumentNullException>(isExpandedProperty != null);
|
|
|
- Contract.Requires<ArgumentNullException>(index != null);
|
|
|
|
|
|
ItemsProperty = itemsProperty;
|
|
|
IsExpandedProperty = isExpandedProperty;
|
|
|
- Index = index;
|
|
|
+ UpdateIndex();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// Gets the container index for the tree.
|
|
|
/// </summary>
|
|
|
- public TreeContainerIndex Index { get; }
|
|
|
+ public TreeContainerIndex Index { get; private set; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// Gets the item container's Items property.
|
|
|
@@ -70,7 +71,7 @@ namespace Avalonia.Controls.Generators
|
|
|
}
|
|
|
else if (container != null)
|
|
|
{
|
|
|
- Index.Add(item, container);
|
|
|
+ Index?.Add(item, container);
|
|
|
return container;
|
|
|
}
|
|
|
else
|
|
|
@@ -92,7 +93,7 @@ namespace Avalonia.Controls.Generators
|
|
|
result.DataContext = item;
|
|
|
}
|
|
|
|
|
|
- Index.Add(item, result);
|
|
|
+ Index?.Add(item, result);
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
@@ -101,24 +102,50 @@ namespace Avalonia.Controls.Generators
|
|
|
public override IEnumerable<ItemContainerInfo> Clear()
|
|
|
{
|
|
|
var items = base.Clear();
|
|
|
- Index.Remove(0, items);
|
|
|
+ Index?.Remove(0, items);
|
|
|
return items;
|
|
|
}
|
|
|
|
|
|
public override IEnumerable<ItemContainerInfo> Dematerialize(int startingIndex, int count)
|
|
|
{
|
|
|
- Index.Remove(startingIndex, GetContainerRange(startingIndex, count));
|
|
|
+ Index?.Remove(startingIndex, GetContainerRange(startingIndex, count));
|
|
|
return base.Dematerialize(startingIndex, count);
|
|
|
}
|
|
|
|
|
|
public override IEnumerable<ItemContainerInfo> RemoveRange(int startingIndex, int count)
|
|
|
{
|
|
|
- Index.Remove(startingIndex, GetContainerRange(startingIndex, count));
|
|
|
+ Index?.Remove(startingIndex, GetContainerRange(startingIndex, count));
|
|
|
return base.RemoveRange(startingIndex, count);
|
|
|
}
|
|
|
|
|
|
public override bool TryRecycle(int oldIndex, int newIndex, object item) => false;
|
|
|
|
|
|
+ public void UpdateIndex()
|
|
|
+ {
|
|
|
+ if (Owner is TreeView treeViewOwner && Index == null)
|
|
|
+ {
|
|
|
+ Index = new TreeContainerIndex();
|
|
|
+ _treeView = treeViewOwner;
|
|
|
+ }
|
|
|
+ else if (Owner.IsAttachedToLogicalTree)
|
|
|
+ {
|
|
|
+ var treeView = Owner.GetSelfAndLogicalAncestors().OfType<TreeView>().FirstOrDefault();
|
|
|
+
|
|
|
+ if (treeView != _treeView)
|
|
|
+ {
|
|
|
+ Clear();
|
|
|
+ Index = treeView?.ItemContainerGenerator?.Index;
|
|
|
+ _treeView = treeView;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Clear();
|
|
|
+ Index = null;
|
|
|
+ _treeView = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
class WrapperTreeDataTemplate : ITreeDataTemplate
|
|
|
{
|
|
|
private readonly IDataTemplate _inner;
|