Thread ID: |
Created: |
Updated: |
Platform: |
Replies: |
150981 | Jan 27,2020 07:35 AM UTC | Feb 7,2020 04:03 AM UTC | Blazor | 3 |
![]() |
Tags: TreeView |
<EjsTreeView TValue="FileInfoViewModel">
<TreeViewFieldsSettings TValue="FileInfoViewModel"
DataSource="@FileInfoViewModels"
Id="Key"
Text="Name"
Child="@("Children")"
Selected="Selected"
Expanded="Expanded">
</TreeViewFieldsSettings>
</EjsTreeView>
@code
{
public ReadOnlyObservableCollection<FileInfoViewModel> FileInfoViewModels;
private readonly CompositeDisposable cleanup = new CompositeDisposable();
protected override void OnInitialized()
{
base.OnInitialized();
var tree = FileSystemService.FileInfoTree;
tree.Bind(out FileInfoViewModels)
.DisposeMany()
.Subscribe()
.DisposeWith(cleanup);
}
public void Dispose()
{
cleanup.Dispose();
}
}
public class FileInfoViewModel : ReactiveObject, IDisposable
{
private readonly CompositeDisposable cleanup = new CompositeDisposable();
public string Key { get; }
public string Name => FileInfo.Name;
public Optional<FileInfoViewModel> Parent { get; }
public VirtualFileInfo FileInfo { get; }
[Reactive]
public bool Expanded { get; set; }
[Reactive]
public bool Selected { get; set; }
private ReadOnlyObservableCollection<FileInfoViewModel> children;
public ReadOnlyObservableCollection<FileInfoViewModel> Children => children;
internal FileInfoViewModel(Node<VirtualFileInfo, string> node, FileInfoViewModel parent = null)
{
Key = node.Key;
Parent = parent;
FileInfo = node.Item;
var childrenLoader = new Lazy<IDisposable>(() =>
node.Children
.Connect()
.Transform(e => new FileInfoViewModel(e, this))
.Bind(out children)
.DisposeMany()
.Subscribe());
var shouldExpand = node.IsRoot
? Observable.Return(true)
: Parent.Value.WhenAnyValue(x => x.Expanded);
shouldExpand
.Where(isExpanded => isExpanded)
.Take(1)
.Subscribe(_ => childrenLoader.Value.DisposeWith(cleanup))
.DisposeWith(cleanup);
}
public void Dispose()
{
cleanup.Dispose();
}
}
public IObservableCache<VirtualFileInfo, string> FileInfos => fileInfoSourceCache.AsObservableCache();
public IObservable<IChangeSet<FileInfoViewModel, string>> FileInfoTree =>
FileInfos
.Connect()
.TransformToTree(fileInfo => Path.GetDirectoryName(fileInfo.VirtualPath),
Observable.Return<Func<Node<VirtualFileInfo, string>, bool>>(node => node.IsRoot))
.Transform(node => new FileInfoViewModel(node));
This post will be permanently deleted. Are you sure you want to continue?
Sorry, An error occured while processing your request. Please try again later.
This page will automatically be redirected to the sign-in page in 10 seconds.