using FastReport.Utils; using System.Collections.Generic; using System.ComponentModel; using System.IO; namespace WpfDemo { public class DemoReports { private XmlDocument xmlDoc; private string filter; public BindingList Categories { get; } public string Filter { get => filter; set { filter = value; FillItems(); } } private bool FilterIsSet => !string.IsNullOrEmpty(Filter); private void FillItems() { Categories.Clear(); for (int i = 0; i < xmlDoc.Root.Count; i++) { var category = xmlDoc.Root[i]; var categoryName = category.GetProp("Name"); var categoryItem = new CategoryItem(this) { Category = categoryName.ToUpper() }; for (int j = 0; j < category.Count; j++) { var fileName = Path.Combine(categoryName, category[j].GetProp("File")); var displayName = category[j].GetProp("DisplayName"); if (string.IsNullOrEmpty(displayName)) displayName = Path.GetFileNameWithoutExtension(fileName); var tags = category[j].GetProp("Tags"); bool match = !FilterIsSet || displayName.IndexOf(Filter, System.StringComparison.OrdinalIgnoreCase) != -1 || tags.IndexOf(Filter, System.StringComparison.OrdinalIgnoreCase) != -1; if (match) { var reportItem = new ReportItem(this) { FileName = fileName, DisplayName = displayName, Tags = tags }; categoryItem.Reports.Add(reportItem); } } if (categoryItem.Reports.Count > 0) Categories.Add(categoryItem); if (FilterIsSet) categoryItem.IsExpanded = true; } if (!FilterIsSet && Categories.Count > 0) Categories[0].IsExpanded = true; } internal void SetItemExpandedExclusive(CategoryItem item) { if (FilterIsSet) return; foreach (var category in Categories) { if (category != item) category.IsExpanded = false; } if (item != null && item.Reports.Count > 0) item.Reports[0].IsSelected = true; } public DemoReports(string reportsXmlFile) { xmlDoc = new XmlDocument(); xmlDoc.Load(reportsXmlFile); Categories = new BindingList(); FillItems(); } } public class TreeItem : INotifyPropertyChanged { private bool isSelected; private bool isExpanded; internal DemoReports Owner { get; } public bool IsSelected { get => isSelected; set { isSelected = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsSelected))); } } public virtual bool IsExpanded { get => isExpanded; set { isExpanded = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsExpanded))); } } public event PropertyChangedEventHandler PropertyChanged; public TreeItem(DemoReports owner) { Owner = owner; } } public class CategoryItem : TreeItem { public string Category { get; set; } public List Reports { get; } = new List(); public override bool IsExpanded { get => base.IsExpanded; set { base.IsExpanded = value; if (value) Owner.SetItemExpandedExclusive(this); } } public CategoryItem(DemoReports owner) : base(owner) { } } public class ReportItem : TreeItem { public string FileName { get; set; } public string DisplayName { get; set; } public string Tags { get; set; } public ReportItem(DemoReports owner) : base(owner) { } } }