Следующая проблема сводит меня с ума, в последние два дня я тратил свои дни, пытаясь ее решить, поэтому я действительно пытался ее исследовать.
Моя проблема в том, что когда я использую привязку данныхдля дерева, это не похоже на работу.Возможно, я что-то упустил, и я хотел бы попросить вашей помощи найти его.
Для 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();
}
}
}