TreeView不显示存储在数据中的子节点
在我的程序中,我有一个带有数据支持的TreeView
(查看模型和数据模型)。 添加到TreeView
每个项目都会添加一个子项目,但由于某种原因,子项在运行时没有反映。 但是,我能够在调试期间看到子项, TreeView's
数据模型中的“Children”属性在其setter中包含NotifyPropertyChange
。
注意:之前我遇到了类似的问题,即新添加的节点(这些子节点的父节点)也不会显示。 通过在树的xaml中设置DisplayMemberPath="DisplayName.Value"
来解决此问题。
TreeView's
xaml:
TreeView ItemsSource="{Binding UserControl_DataModel.TreeViewViewModel.ObservableCollection}" DisplayMemberPath="DisplayName.Value".../>
这是创建新节点并将其添加到TreeView
(TreeViewViewModel)的位置:
private TreeViewDataModel createNewNode(StringItem nodeName) { var newNode = new TreeViewDataModel () { DisplayName = nodeName }; newNode.Children.Add(new TreeViewDataModel () { DisplayName = nodeName}); return newNode; } public void addNewLocNode(StringItem nodeName) { TreeObservableCollection.Add(createNewNode(nodeName)); }
注意: StringItem
是一个自定义类。 在StringItem
, Value
返回项的字符串值。 (例如: StringItem.Value
)
TreeViewDataModel中的Children属性:
public ObservableCollection Children { get { return _children ?? (_children = new ObservableCollection()); } set { _children = value; NotifyPropertyChange(() => Children); } }
为什么子节点不会出现在我的TreeView
,我该如何解决这个问题呢?
您没有足够的代码让我确切地知道您是如何设置的。 我试图让它与你已有的相似。 我想你应该能够弄清楚。
截图:
XAML:
码:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApplication9 { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public ObservableCollection TreeObservableCollection { get; set; } public MainWindow() { InitializeComponent(); TreeObservableCollection = new ObservableCollection (); this.DataContext = this; this.Loaded += MainWindow_Loaded; } void MainWindow_Loaded(object sender, RoutedEventArgs e) { addNewLocNode(new StringItem("A")); addNewLocNode(new StringItem("B")); addNewLocNode(new StringItem("C")); addNewLocNode(new StringItem("D")); } private TreeViewDataModel createNewNode(StringItem nodeName) { var newNode = new TreeViewDataModel() { DisplayName = nodeName }; newNode.Children.Add(new TreeViewDataModel() { DisplayName = nodeName }); return newNode; } public void addNewLocNode(StringItem nodeName) { TreeObservableCollection.Add(createNewNode(nodeName)); } } public class StringItem { public string Value { get; set; } public StringItem(string val) { Value = val; } } public class TreeViewDataModel : System.ComponentModel.INotifyPropertyChanged { public StringItem DisplayName { get; set; } private ObservableCollection _children; public ObservableCollection Children { get { return _children ?? (_children = new ObservableCollection ()); } set { _children = value; NotifyPropertyChange("Children"); } } private void NotifyPropertyChange(string name) { if (PropertyChanged != null) PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(name)); } #region INotifyPropertyChanged Members public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; #endregion } }
ALT-方式: