Treeview в Xaml для самостоятельно созданного класса - PullRequest
0 голосов
/ 04 июля 2019

Может кто-нибудь сказать мне, как создать древовидное представление в wpf для следующего класса?

Я пытаюсь часами, без какого-либо успеха ...

Я использовал поисковую функцию, а также Google. но мой случай, кажется, отличается, или я к ....

namespace EIT_Base
{
public class LocationTreeAlsTree : IEnumerable,IEnumerator
    {
        // Integriere den Logger von NLog
        private static readonly Logger logger = LogManager.GetCurrentClassLogger();

        // Eigenschaften der Klasse LocationTreeAlsTree
        public List<ComponentRef> Elements { get; set; }
        public int position = -1;

        public static List<ComponentRef> LoadUnits(IEnumerable<XElement> _componentenRef)
        {
            return _componentenRef.Select(x => new ComponentRef()
            {
                ID = Convert.ToInt32(x.Attribute("ref").Value),
                Children = LoadUnits(x.Elements("componentRef"))
            }).ToList();
        }

        public LocationTreeAlsTree(string _filename)
        {
            string locationtreeFile = _filename;
            StreamReader reader = new StreamReader(locationtreeFile, Encoding.UTF8);
            XDocument doc = XDocument.Load(reader);
            Elements = LoadUnits(doc.Descendants("componentRef"));
        }

        public IEnumerator GetEnumerator() { return this.Elements.GetEnumerator(); }

        public bool MoveNext() { position++; return (position < Elements.Count); }

        public void Reset() { position = -1; }

        public object Current { get { return Convert.ToInt32(Elements[position].ID); } }
    }

1 Ответ

0 голосов
/ 04 июля 2019

Похоже, вы выбираете маршрут, который сложнее, чем вам действительно нужно.Вот основной способ достижения того, что вы пытаетесь достичь.

Добавьте это к вашему XML:

<TreeView ItemsSource="{Binding TopLevelElements}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Elements}">
            <Grid>
                <!-- Bind display information for any given Element's xDocument or whatever you want -->
            </Grid>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Затем создайте некоторый класс Element, который имеет ObservableCollection of Elements (создаем рекурсивную структуру, которую мы хотим в древовидном представлении):

public class Element 
{
    public ObservableCollection<Element> Elements = new ObservableCollection<Element>();

    public Element(string filename) 
    {
        StreamReader reader = new StreamReader(locationtreeFile, Encoding.UTF8);
        XDocument doc = XDocument.Load(reader);
        Elements = LoadUnits(doc.Descendants("componentRef"));
    }
}

Наконец, определите некоторую ObservableCollection элемента верхнего уровня для вашего древовидного представления, чтобы изначально связать с:

public ObservableCollection<Element> TopLevelElements = new ObservableCollection<Element>();

public MainWindow() 
{
    TopLevelElements.Add(new Element("filename"));

    DataContext = this;

    InitializeComponent();
}

Как вы можетесм. в части XML, HierarchicalDataTemplate ItemsSource для элементов.Так как каждый элемент имеет ObservableCollection of Elements, он будет вытягивать древовидную структуру в соответствии с этой структурой объекта.Вы можете ссылаться на свойства Element в структуре XML HierarchicalDataTemplate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...