Quantcast
Channel: Windows Presentation Foundation (WPF) forum
Viewing all articles
Browse latest Browse all 18858

Problems in creating Hierarchical Data Template on the treeview

$
0
0

Hi,

I've tried to create a treeview, however I've had problem in showing the data in the treeview. Let me show how the treeview would be.

Table 01

 ---- Fields

 -------- Field 01

 -------- RelatedField 01

 -----RelatedTables

 -------- Table R 01

 ------------ Fields

------------------ Field 01

          - RelatedTable

Table 02

 ---- Fields

 -------- Field 01

 -------- RelatedField 01

 -----RelatedTables

 -------- Table R 01

 ------------ Fields

------------------ Field 01

          - RelatedTable

So, Here are the classes:

    public interface ITableField
    {
        string Name { get; set; }
        string Alias { get; set; }
        Table Parent { get; }
    }

    public class MainTableCollection: ObservableCollection<Table>
    {
        public void AddRange(IEnumerable<Table> tables)
        {
            tables.ToList().ForEach(Add);
        }
    }

    public sealed class RelatedTableCollection : ObservableCollection<Table>
    {
        public void AddRange(IEnumerable<Table> relatedTables)
        {
            relatedTables.ToList().ForEach(Add);
        }
    }

    public sealed class RelatedTableField : PropertyChangedBase, ITableField
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                NotifyOfPropertyChange(() => Name);
            }
        }

        private string _alias;
        public string Alias
        {
            get { return _alias; }
            set
            {
                _alias = value;
                NotifyOfPropertyChange(() => Alias);
            }
        }

        private Table _parent;
        public Table Parent
        {
            get { return _parent; }
            set
            {
                _parent = value;
                NotifyOfPropertyChange(() => Parent);
            }
        }

        private TableField _originalField;
        public TableField OriginalField
        {
            get { return _originalField; }
            set
            {
                _originalField = value;
                NotifyOfPropertyChange(() => OriginalField);
            } 
        }
    }

    public sealed class Table : PropertyChangedBase
    {
        public Table()
        {
            Fields = new TableFieldCollection();
            RelatedTables = new RelatedTableCollection();
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                NotifyOfPropertyChange(() => Name);
            }
        }

        private string _alias;
        public string Alias
        {
            get { return _alias; }
            set
            {
                _alias = value;
                NotifyOfPropertyChange(() => Alias);
            }
        }

        public RelatedTableCollection RelatedTables { get; private set; }

        public TableFieldCollection Fields { get; private set; }
    }

    public sealed class TableField : PropertyChangedBase, ITableField
    {
        private string _name;
        public string Name 
        {
            get { return _name; }
            set
            {
                _name = value;
                NotifyOfPropertyChange(() => Name);
            }
        }

        private string _alias;
        public string Alias 
        {
            get { return _alias; }
            set
            {
                _alias = value;
                NotifyOfPropertyChange(() => Alias);
            } 
        }

        private Table _parent; 
        public Table Parent 
        {
            get { return _parent; }
            set
            {
                _parent = value;
                NotifyOfPropertyChange(() => Parent);
            }
        }
    }

public sealed class TableFieldCollection : ObservableCollection<ITableField>
    {
        public void AddRange(IEnumerable<ITableField> fields)
        {
            fields.ToList().ForEach(Add);
        }
    }


Now, here are the view and viewmodel:

    public class TableTreeViewModel : Screen, IViewModelIdentity
    {
        #region Fields and Constants

        private readonly IEventAggregator _events;
        //private const string PREVIOUS = "BackendGeneratorViewModel";

        #endregion

        #region Constructors

        [ImportingConstructor]
        public TableTreeViewModel(IEventAggregator events)
        {
            _events = events;

            this.ScreenIdentity = this.GetType().Name;

            MainTables = new MainTableCollection();
            MainTables.AddRange(createMainTables());
        }

        #endregion

        #region Properties

        public string ScreenIdentity { get; set; }

        public MainTableCollection MainTables { get; set; }

        #endregion

        #region Methods

        private IEnumerable<Table> createMainTables()
        {
            var MainTables = new List<Table>();

            var adsp010 = new Table
            {
                Name = "ADSP010",
                Alias = "Pessoa"
            };
            adsp010.Fields.Add(new TableField{Alias = "Código", Name = "nId", Parent = adsp010});
            adsp010.Fields.Add(new TableField { Alias = "Nome", Name = "cNome", Parent = adsp010 });

            var adsp044 = new Table
            {
                Name = "ADSP044",
                Alias = "Fornecedor"
            };
            adsp044.Fields.Add(new TableField { Alias = "Código", Name = "nId", Parent = adsp044 });
            adsp044.Fields.Add(new TableField { Alias = "Descricao", Name = "cDescricao", Parent = adsp044 });
            adsp044.Fields.Add(new RelatedTableField
            {
                Alias = "NomeFornecedor",
                Name = "cNomeRelated",
                Parent = adsp044,
                OriginalField = adsp010.Fields[1] as TableField});

            adsp044.RelatedTables.Add(adsp010);

            MainTables.Add(adsp044);

            return MainTables;
        }

        #endregion
<TreeView Grid.Column="0" ItemsSource="{Binding MainTables}"><TreeView.Resources><HierarchicalDataTemplate  DataType="{x:Type table:Table}"><Border Style="{StaticResource DarkBlueBorderStyle}"><StackPanel Orientation="Horizontal"><Image Source="pack://application:,,,/Resources/table.png"/><TextBlock Text="{Binding Alias}" Foreground="#003D50" Margin="5,0,0,0"/></StackPanel></Border></HierarchicalDataTemplate><HierarchicalDataTemplate  DataType="{x:Type table:RelatedTableCollection}"><Border Style="{StaticResource DarkGrayBorderStyle}"><StackPanel Orientation="Horizontal"><Image Source="pack://application:,,,/Resources/relatedTable.png"/><TextBlock Text="{Binding Alias}" Foreground="#2F2F2F" Margin="5,0,0,0"/></StackPanel></Border></HierarchicalDataTemplate><HierarchicalDataTemplate  DataType="{x:Type table:TableFieldCollection}"><Border Style="{StaticResource DarkBlueBorderStyle}"><StackPanel Orientation="Horizontal"><Image Source="pack://application:,,,/Resources/tableField.png"/><TextBlock Text="{Binding Alias}" Foreground="#003D50" Margin="5,0,0,0"/></StackPanel></Border></HierarchicalDataTemplate><HierarchicalDataTemplate  DataType="{x:Type table:TableField}"><TextBlock Text="{Binding Alias}" Foreground="#000000" Margin="3"/></HierarchicalDataTemplate><DataTemplate DataType="{x:Type table:RelatedTableField}"><TextBlock Text="{Binding Alias}" Foreground="#6A6A6A" FontWeight="Medium" Margin="3"/></DataTemplate></TreeView.Resources></TreeView>

It's not clear for me in creating HierarchicalDataTemplate. I thought it was correct, however shows just a table in the hierarchy.

Did anybody already have this problem?

Thank you very much! 


Viewing all articles
Browse latest Browse all 18858

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>