TreeView

<navigation:Page xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
  x:Class="BusinessApplication1.Home" 
  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:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
  xmlns:Data="clr-namespace:System.Windows;assembly=System.Windows.Controls" 

  mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"  
  Style="{StaticResource PageStyle}">
    
    

  <Grid x:Name="LayoutRoot">
        <Grid.Resources>
            <Data:HierarchicalDataTemplate x:Key="UserGroupTemplate" 
                      ItemsSource="{Binding Childern}">
                <StackPanel Orientation="Horizontal" 
                      Height="Auto" Width="Auto">  
                    <TextBlock> <Run Text="{Binding Name}"></Run>(<Run Text="{Binding Type}"></Run>) </TextBlock>
                </StackPanel>
            </Data:HierarchicalDataTemplate>
            <Style TargetType="sdk:TreeView" x:Key="UserGroupStyle">
                <Setter Property="ItemTemplate" 
                       Value="{StaticResource UserGroupTemplate}"/>
                <Setter Property="BorderThickness" Value="1"/>
            </Style> 

        </Grid.Resources>
            <ScrollViewer x:Name="PageScrollViewer" Style="{StaticResource PageScrollViewerStyle}">

        <StackPanel x:Name="ContentStackPanel" Style="{StaticResource ContentStackPanelStyle}">

                <Grid>
                    <Grid.ColumnDefinitions >
                        <ColumnDefinition Width="250"></ColumnDefinition>
                        <ColumnDefinition Width="*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"></RowDefinition>
                        <RowDefinition Height="30"></RowDefinition>
                    </Grid.RowDefinitions>
                    <sdk:TreeView x:Name="trv" SelectedItemChanged="trv_SelectedItemChanged"
                                  ItemsSource="{Binding Items}" 
                                  Style="{StaticResource UserGroupStyle}"></sdk:TreeView>
                    <StackPanel Grid.Row="1" Orientation="Horizontal" >
                        <Button Content="+B" CommandParameter="Brand" Command="{Binding AddItemCMD}"></Button>
                        <Button Content="+L" CommandParameter="Product Line" Command="{Binding AddItemCMD}"></Button>
                        <Button Content="+P" CommandParameter="Product" Command="{Binding AddItemCMD}"></Button>
                        <Button Content="+T" CommandParameter="Task" Command="{Binding AddItemCMD}"></Button>
                    </StackPanel>
                   
                </Grid>                   

      </StackPanel>

    </ScrollViewer>
  </Grid>

</navigation:Page>
namespace BusinessApplication1
{
    using System.Windows.Controls;
    using System.Windows.Navigation;
    using System.Collections.ObjectModel;
    using System;
    using System.Windows;
    using System.ComponentModel;
    using System.Linq.Expressions;
    using System.Windows.Input;

    /// <summary>
    /// Home page for the application.
    /// </summary>
    public partial class Home : Page
    {
        /// <summary>
        /// Creates a new <see cref="Home"/> instance.
        /// </summary>
        public Home()
        {
            InitializeComponent();

            this.Title = ApplicationStrings.HomePageTitle;

            this.DataContext = VM ;


        }

        MainViewModel VM = new MainViewModel();

        void trv_SelectedItemChanged(object sender, System.Windows.RoutedPropertyChangedEventArgs<object> e)
        {
            VM.SelectedItem = e.NewValue as NameValue;
        }

        /// <summary>
        /// Executes when the user navigates to this page.
        /// </summary>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }
    }

    public class MainViewModel : NotifyPropertyChangedBase
    {
        public MainViewModel()
        {
            addItemCMD = new XCommand(AddItem);
        }

        ObservableCollection<NameValue> items = new ObservableCollection<NameValue>();
        public ObservableCollection<NameValue> Items { get { return items; } }

        NameValue selectedItem;
        public NameValue SelectedItem { get { return selectedItem; } set { selectedItem = value; RaisePropertyChanged(() => this.SelectedItem); } }

        string type;
        XCommand addItemCMD;
        public XCommand AddItemCMD { get { return addItemCMD; } }
        void AddItem(object p)
        {
            type = p as string;
            BusinessApplication1.Views.AddItem add = new Views.AddItem();
            add.Title = "Add " + type;
            add.Closed += new EventHandler(add_Closed);
            add.Show();
            
        }

        void add_Closed(object sender, EventArgs e)
        {
            BusinessApplication1.Views.AddItem add = sender as BusinessApplication1.Views.AddItem ;

            if (add.DialogResult == true)
            {
                var nv = new NameValue { Name = add.name.Text, Type = type };
                if (selectedItem == null)
                {
                    items.Add(nv);
                    MessageBox.Show("Added " + type + " as Root");
                }
                else
                {
                    selectedItem.Childern.Add(nv);
                    MessageBox.Show("Added " + type + " under " + selectedItem.Name);
                }
            }
            else
            {
                MessageBox.Show("Discard changes !");
            }
        }

    }

    public class NameValue
    {
        public string Name { get; set; }
        public string Value { get; set; }
        public string Type { get; set; }
        ObservableCollection<NameValue> childern = new ObservableCollection<NameValue>();
        public ObservableCollection<NameValue> Childern { get { return childern; } }

        public static ObservableCollection<NameValue> Get()
        {
            ObservableCollection<NameValue> list = new ObservableCollection<NameValue>();
            Random r = new Random();
            for (int i = 1; i < r.Next(5, 10); i++)
            {
                NameValue root1 = new NameValue { Name = "Node_" + i, Type = "Brand" };
                list.Add(root1);
                for (int j = 1; j < r.Next(5, 10); j++)
                {
                    NameValue root2 = new NameValue { Name = "Node_" + i + "_" + j, Type = j % 3 == 1 ? "Key Word" : "Product Line" };
                    root1.Childern.Add(root2);
                    for (int l = 1; l < r.Next(5, 10); l++)
                    {
                        NameValue root3 = new NameValue { Name = "Node_" + i + "_" + j + "_" + l, Type = l % 3 == 1 ? "Key Word" : "Product" };
                        root2.Childern.Add(root3);
                    }
                }
            }
            return list;
        }
    }

    public class XCommand : ICommand //: ICommand
    {
        private Predicate<object> canExecute;
        bool prevCanExe = true;
        private Action<object> action;
        public event EventHandler CanExecuteChanged;

        public XCommand(Action<object> method)
            : this(method, null)
        {
        }

        public XCommand(Action<object> _action, Predicate<object> _canExecute)
        {
            action = _action;
            canExecute = _canExecute;
            prevCanExe = CanExecute(null);
        }

        public bool CanExecute(object parameter)
        {
            if (canExecute == null)
                return true;
            bool temp = canExecute(parameter);
            if (temp != prevCanExe)
            {
                prevCanExe = temp;
                if (CanExecuteChanged != null)
                {
                    CanExecuteChanged(this, EventArgs.Empty);
                }
            }
            return temp;
        }

        public void Execute(object parameter)
        {
            if (CanExecute(parameter) && action != null)
                action(parameter);
        }
    }

    public abstract class NotifyPropertyChangedBase : INotifyPropertyChanged
    {
        #region Constructor

        protected NotifyPropertyChangedBase()
        {

        }

        #endregion

        #region Events

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Event Handlers

        /// <summary>
        /// Get name of property
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="e"></param>
        /// <returns></returns>
        public static string GetPropertyName<T>(Expression<Func<T>> e)
        {
            var member = (MemberExpression)e.Body;
            return member.Member.Name;
        }
        /// <summary>
        /// Raise when property value propertychanged or override propertychage
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="propertyExpression"></param>
        protected virtual void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
        {
            RaisePropertyChanged(GetPropertyName(propertyExpression));
        }
        /// <summary>
        /// Raise when property value propertychanged
        /// </summary>
        /// <param name="propertyName"></param>
        protected void RaisePropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler temp = PropertyChanged;
            if (temp != null)
            {
                temp(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

    }


}
原文地址:https://www.cnblogs.com/mjgb/p/3161436.html