代码之家  ›  专栏  ›  技术社区  ›  Eric after dark

TreeView不显示数据中存储的子项

  •  0
  • Eric after dark  · 技术社区  · 12 年前

    在我的计划中,我有一个 TreeView 具有数据备份(视图模型和数据模型)。添加到 TreeView(树视图) 获取随它添加的子项,但由于某些原因,子项在运行时没有反映。但是,我可以在调试过程中看到孩子,并在 TreeView's 数据模型包括 NotifyPropertyChange 在它的二传手。

    注意:之前我遇到过类似的问题,新添加的节点(这些子节点的父节点)也不会显示。此问题已通过设置 DisplayMemberPath="DisplayName.Value" 在树的xaml中。

    TreeView的 xaml:

    TreeView ItemsSource="{Binding UserControl_DataModel.TreeViewViewModel.ObservableCollection<TreeViewDataModel>}" 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 是自定义类。在里面 字符串项 , Value 返回项的字符串值。(例如: StringItem.Value )

    TreeViewDataModel中的Children属性:

    public ObservableCollection<TreeViewDataModel> Children
    {
        get { return _children ?? (_children = new ObservableCollection<TreeViewDataModel>()); }
        set
        {
            _children = value;
            NotifyPropertyChange(() => Children);
        }
    }
    

    为什么子节点不显示在我的 TreeView(树视图) ,我该怎么解决?

    1 回复  |  直到 12 年前
        1
  •  0
  •   J.H.    12 年前

    你没有足够的代码让我知道你是如何设置的。我试图让它与你已有的相似。我想你应该能弄清楚。

    截图:

    enter image description here

    XAML:

    <Window x:Class="WpfApplication9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:WpfApplication9"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView ItemsSource="{Binding TreeObservableCollection}"> <!-- DisplayMemberPath="DisplayName.Value" - Can't set both DisplayMemberPath and ItemTemplate -->
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type app:TreeViewDataModel}" ItemsSource="{Binding Children}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding DisplayName.Value}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
    

    代码:

    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
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public ObservableCollection<TreeViewDataModel> TreeObservableCollection { get; set; }
    
            public MainWindow()
            {
                InitializeComponent();
                TreeObservableCollection = new ObservableCollection<TreeViewDataModel>();
                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<TreeViewDataModel> _children;
            public ObservableCollection<TreeViewDataModel> Children
            {
                get { return _children ?? (_children = new ObservableCollection<TreeViewDataModel>()); }
                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
        }
    }
    

    交替方式:

    <Window x:Class="WpfApplication9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:WpfApplication9"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <HierarchicalDataTemplate DataType="{x:Type app:TreeViewDataModel}" ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding DisplayName.Value}" />
        </HierarchicalDataTemplate>
    </Window.Resources>
    <Grid>
        <TreeView ItemsSource="{Binding TreeObservableCollection}" />
    </Grid>