Чего не хватает в коде, чтобы заставить дерево работать? - PullRequest
0 голосов
/ 20 сентября 2019

Следующая проблема сводит меня с ума, в последние два дня я тратил свои дни, пытаясь ее решить, поэтому я действительно пытался ее исследовать.

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

Для WPF XAML я использую следующий код:

<Window x:Class="MesDiag2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:MesDiag2"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">

<Window.Resources>
    <HierarchicalDataTemplate ItemsSource="{Binding Materials}" DataType="{x:Type local:ProductNode}">
        <Label Content="{Binding Product.LotName}"/>
    </HierarchicalDataTemplate>
</Window.Resources>

<Grid>

    <TreeView ItemsSource="{Binding Root}">

    </TreeView>


</Grid>

Мои занятия следующие, обратите внимание, что это всего лишь «тестовый» проект, который я сделал, чтобы увидеть, в чем проблема.Я старался сделать все максимально простым.INotifyPropertyChanged для каждого класса был просто отчаянной попыткой увидеть, исправляет ли он это:

using System.ComponentModel;

namespace MesDiag2
{
    public class Product : INotifyPropertyChanged
    {
        string lotName;
        public string LotName
        {
            get { return lotName; }
            set
            {
                lotName = value;
                NotifyPropertyChanged("LotName");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

Контекст TreeViewItem должен быть следующим классом:

using System.Collections.Generic;
using System.ComponentModel;

namespace MesDiag2
{
    public class ProductNode : INotifyPropertyChanged
    {
        Product product;
        List<Product> materials;

        public ProductNode(Product product)
        {
            Materials = new List<Product>();
            Product = product;
        }

        public Product Product
        {
            get { return product; }
            set
            {
                product = value;
                NotifyPropertyChanged("Product");
            }
        }

        public List<Product> Materials
        {
            get { return materials; }
            set
            {
                materials = value;
                NotifyPropertyChanged("Materials");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

Моя ViewModel:

using System.ComponentModel;

namespace MesDiag2
{
    public class ViewModel : INotifyPropertyChanged
    {
        public ProductNode Root { get; set; }
        public string Test { get; set; }

        public ViewModel()
        {
            Root = new ProductNode(new Product { LotName = "Test" });
            Test = "Hello";
        }



        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

И, наконец, содержимое моего класса MainWindow:

с использованием System.Windows;

namespace MesDiag2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
    }
}

1 Ответ

0 голосов
/ 20 сентября 2019

Прошло немного времени с тех пор, как я сделал WPF, но я думаю, что вы хотите сделать что-то вроде этого:

<TreeView ItemsSource="{Binding Root.Materials}">
    <HierarchicalDataTemplate>
        <Label Content="{Binding LotName}"/>
    </HierarchicalDataTemplate>
</TreeView>

Я бы также сделал:

 List<Product> materials;

это:

 ObservableCollection<Product> materials

https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1?view=netframework-4.8

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