Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8970119
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 15, 20262026-06-15T17:41:15+00:00 2026-06-15T17:41:15+00:00

See the next post. This original one question content has been removed, as doesn’t

  • 0

See the next post. This original one question content has been removed, as doesn’t have any sense. Briefly, I asked how to bind XML (which I generated by mistake while parsing DLL assembly) to TreeView using XmlDataProvider in MVVM way. But later I understood that this approach was wrong, and I switched to generation of data entity model (just write classes which represent all the entities I would like to expose in the tree) instead of XML.

So, the result in the next post. Currently from time to time I update this “article”, so F5, and

Enjoy reading!

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-15T17:41:15+00:00Added an answer on June 15, 2026 at 5:41 pm

    Introduction

    The right way I had found reading this article

    It’s a long story, most of you just can skip it 🙂 But those, who want to understand the problem and solution, must read this all !

    I’m QA, and some time ago had become responsible for Automation of the product I clicks. Fortunately, this automaton takes place not in some Testing Tool, but in Visual Studio, so it is maximally close to development.

    For our automation we use a framework which consist of MbUnit (Gallio as runner) and of MINT (addition to MbUnit, which is written by the customer we work with). MbUnit gives us Test Fixtures and Tests, and MINT adds additional smaller layer — Actions inside tests. Example. Fixture is called ‘FilteringFixture’. It consist of amount of tests like ‘TestingFilteringById’, or ‘TestingFilteringWithSpecialChars’, etc. Each test consist of actions, which are atomic unit of our test. Example of actions are – ‘Open app (parameter)’, ‘OpenFilterDialog’, etc.

    We already have a lot of tests, which contain a lot of actions, it’s a mess. They use internal API of the product we QA. Also, we start investigation a new Automation approach – UI automation via Microsoft UI Automation (sorry for tautology). So the necessity of some “exporter”, or “reporter” tool became severe for managers.

    Some time ago I have got a task to develop some application, which can parse a DLL (which contains all the fixtures, tests and actions), and export its structure in the human readable format (TXT, HTML, CSV, XML, any other). But, right after that, I went to vacation (2 weeks).

    It happens so, that my girlfriend went to her family until vacation (she also got it), and I remained at home so alone. Thinking what me to do all this time (2 weeks), I remember about that “write exporter tool task” and how long I have been planning to start learning WPF. So, I decided to make my task during vacation, and also dress a application to WPF. At that time I heard something about MVVM, and I decided to implement it using pure MVVM.

    DLL which can parse DLL with fixrtures etc had been written rather fast (~1-2 days). After that I had started with WPF, and this article will show you how it ended.

    I have spent a major part of my vacation (almost 8 days!), trying to sorted it out in my head and code, and finally, it is done (almost). My girlfriend would not believe what I was doing all this time, but I have a proof!

    Sharing my solution step by step in pseudo code, to help others avoid similar problems. This answer is more looks like tutorial =) (Really?). If you are interested what were the most complicated things while learning WPF from scratch, I would say — make it all really MVVM and f*g TreeView binding!

    If you want an archived file with solution, I can give it a bit later, just when I have made a decision, that it is worth of that. One limitation, I’m not sure I may share the MINT.dll, which brings Actions, as it has been developed by the customer of our company. But I can just remove it, and share the application, which can display information about Fixtures and Tests only, but not about actions.

    Boastful words. With just a little C# / WinForms / HTML background and no practice I have been able to implement this version of the application in almost 1 week (and write this article). So, impossible is possible! Just take a vacation like me, and spend it to WPF learning!

    Step by step tutorial (w/o attached files yet)

    Short repetition of the task:

    Some time ago I have got a task to develop an application, which can parse a DLL (which contains test fixtures, test methods and actions – units of our unit testing based automation framework), and export its structure in the human readable format (TXT, HTML, CSV, XML, any other). I decided to implement it using WPF and pure MVVM (both were absolutely new things for me). The 2 most difficult problems for me became MVVM approach itself, and then MVVM binding to TreeView control. I skip the part about MVVM division, it’s a theme for separate article. The steps below are about binding to TreeView in MVVM way.

    1. Not so important: Create DLL which can open DLL with unit tests and finds fixtures, test methods and actions (more smaller level of unit test, written in our company) using reflection. If you are interested in how it had been done, look here: Parsing function / method content using Reflection
    2. DLL: Separated classes are created for both fixtures, tests and actions (data model, entity model?).We’ll use them for binding. You should think by yourself, what will be an entity model for your tree. Main idea – each level of tree should be exposed by appropriate class, with those properties, which help you to represent the model in the tree (and, ideally, will take right place in your MVVM, as model or part of the model). In my case, I was interested in entity name, list of children and ordinal number. Ordinal number is a number, which represents order of an entity in the code inside DLL. It helps me show ordinal number in the TreeView, still not sure it’s right approach, but it works!
    public class MintFixutre : IMintEntity
    {
        private readonly string _name;
        private readonly int _ordinalNumber;
        private readonly List<MintTest> _tests = new List<MintTest>();
        public MintFixutre(string fixtureName, int ordinalNumber)
        {
            _name = fixtureName;
            if (ordinalNumber <= 0)
                throw new ArgumentException("Ordinal number must begin from 1");
            _ordinalNumber = ordinalNumber;
        }
        public List<MintTest> Tests
        {
            get { return _tests; }
        }
        public string Name { get { return _name; }}
        public bool IsParent { get { return true; }  }
        public int OrdinalNumber { get { return _ordinalNumber; } }
    }
    
    public class MintTest : IMintEntity
    {
        private readonly string _name;
        private readonly int _ordinalNumber;
        private readonly List<MintAction> _actions = new List<MintAction>();
        public MintTest(string testName, int ordinalNumber)
        {
            if (string.IsNullOrWhiteSpace(testName))
                throw new ArgumentException("Test name cannot be null or space filled");
            _name = testName;
            if (ordinalNumber <= 0)
                throw new ArgumentException("OrdinalNumber must begin from 1");
            _ordinalNumber = ordinalNumber;
        }
        public List<MintAction> Actions
        {
            get { return _actions; }
        }
        public string Name { get { return _name; } }
        public bool IsParent { get { return true; } }
        public int OrdinalNumber { get { return _ordinalNumber; } }
    }
    
    public class MintAction : IMintEntity
    {
        private readonly string _name;
        private readonly int _ordinalNumber;
        public MintAction(string actionName, int ordinalNumber)
        {
            _name = actionName;
            if (ordinalNumber <= 0)
                throw new ArgumentException("Ordinal numbers must begins from 1");
            _ordinalNumber = ordinalNumber;
    
        }
        public string Name { get { return _name; } }
        public bool IsParent { get { return false; } }
        public int OrdinalNumber { get { return _ordinalNumber; } }
    }
    

    BTW, I also created an interface below, which implement all the entities. Such interface can help you in the future. Still not sure, should I was also add there Childrens property of List<IMintEntity> type, or something like that?

    public interface IMintEntity
    {
        string Name { get; }
        bool IsParent { get; }
        int OrdinalNumber { get; }
    }
    
    1. DLL – building data model: DLL has a method which opens DLL with unit tests and enumerating data. During enumeration, it builds a data model like below. Real method example is given, reflection core + Mono.Reflection.dll are used, don’t be confused with complexity. All that you need – look how the method fills _fixtures list with entities.
    private void ParseDllToEntityModel()
    {
        _fixutres = new List<MintFixutre>();
    
        // enumerating Fixtures
        int f = 1;
        foreach (Type fixture in AssemblyTests.GetTypes().Where(t => t.GetCustomAttributes(typeof(TestFixtureAttribute), false).Length > 0))
        {
            var tempFixture = new MintFixutre(fixture.Name, f);
    
            // enumerating Test Methods
            int t = 1;
            foreach (var testMethod in fixture.GetMethods().Where(m => m.GetCustomAttributes(typeof(TestAttribute), false).Length > 0))
            {
                // filtering Actions
                var instructions = testMethod.GetInstructions().Where(
                    i => i.OpCode.Name.Equals("newobj") && ((ConstructorInfo)i.Operand).DeclaringType.IsSubclassOf(typeof(BaseAction))).ToList();
    
                var tempTest = new MintTest(testMethod.Name, t);
    
                // enumerating Actions
                for ( int a = 1; a <= instructions.Count; a++ )
                {
                    Instruction action = instructions[a-1];
                    string actionName = (action.Operand as ConstructorInfo).DeclaringType.Name;
                    var tempAction = new MintAction(actionName, a);
                    tempTest.Actions.Add(tempAction);
                }
    
                tempFixture.Tests.Add(tempTest);
                t++;
            }
    
            _fixutres.Add(tempFixture);
            f++;
        }
    }
    
    1. DLL: Public property Fixtures of the List<MintFixutre> type is created to return just created data model ( List of Fixtures, which contain lists of tests, which contains lists of Actions ). This will be our binding source for TreeView.
    public List<MintFixutre> Fixtures
    {
        get { return _fixtures; }
    }
    
    1. ViewModel of MainWindow (with TreeView inside): Contains object / class from DLL which can parse unit tests DLLs. Also exposes Fixtures public property from the DLL of List<MintFixutre> type. We will bind to it from XAML of MainWindow. Something like that (simplified):
    var _exporter = MySuperDllReaderExporterClass ();
    // public property of ViewModel for TreeView, which returns property from #4
    public List<MintFixture> Fixtures { get { return _exporter.Fixtures; }}
    // Initializing exporter class, ParseDllToEntityModel() is called inside getter 
    // (from step #3). Cool, we have entity model for binding.
    _exporter.PathToDll = @"open file dialog can help";
    // Notifying all those how are bound to the Fixtures property, there are work for them, TreeView, are u listening?
    // will be faced later in this article, anticipating events
    OnPropertyChanged("Fixtures");
    
    1. XAML of MainWindow – Setup data templates: Inside a Grid, which contains TreeView, we create <Grid.Resources> section, which contains a set of templates for our TreeViewItems. HierarchicalDataTemplate (Fixtures and Tests) is used for those who have child items, and DataTemplate is used for “leaf” items (Actions). For each template, we specify which its Content (text, TreeViewItem image, etc.), ItemsSource (in case of this item has children, e.g. for Fixtures it is {Binding Path=Tests}), and ItemTemplate (again, only in case this item has children, here we set linkage between templates – FixtureTemplate uses TestTemplate for its children, TestTemplate uses ActionTemplate for its children, Action template does not use anything, it is a leaf!). IMPORTANT: Don’t forget, that in order to “link” “one” template to “another”, the “another” template must be defined in XAML above the “one”! (just enumerating my own blunders 🙂 )

    2. XAML – TreeView linkage: We setup TreeView with: linking with data model from ViewModel (remember public property?) and with just prepared templates, which represent content, appearance, data sources and nesting of tree items! One more important note. Don’t define your ViewModel as “static” resource inside XAML, like <Window.Resources><MyViewModel x:Key="DontUseMeForThat" /></Window.Resources>. If you do so, then you won’t be able to notify it on property changed. Why? Static resource is static resource, it initializes ones, and after that remains immutable. I might be wrong here, but it was one of my blunders. So for TreeView use ItemsSource="{Binding Fixtures}" instead of ItemsSource="{StaticResource myStaticViewModel}"

    3. ViewModel – ViewModelBase – Property Changed: Almost all. Stop! When user opens an application, then initially TreeView is empty of course, as user hasn’t opened any DLL yet! We must wait until user opens a DLL, and only then perform binding. It is done via OnPropertyChanged event. To make life easier, all my ViewModels are inherited from ViewModelBase, which right exposes this functionality to all my ViewModel.

    public class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected virtual void OnPropertyChanged(string propertyName)
        {
            OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
        }
    
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
        {
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, args);
        }        
    }
    
    1. XAML – OnPropertyChanged and commanding. User clicks a button to opens DLL which contains unit tests data. As we using MVVM, then click is handled via commanding. At the end of the OpenDllExecuted handler OnPropertyChanged("Fixtures") is executed, notifying the Tree, that the property, to which it is bind to has been changed, and that now is time to refresh itself. RelayCommand helper class can be taken for example from there). BTW, as I know, there are some helper libraries and toolkits exist Something like that happens in the XAML:

    2. And ViewModel – Commanding

    private ICommand _openDllCommand;
    
            //...
    
    public ICommand OpenDllCommand
    {
        get { return _openDllCommand ?? (_openDllCommand = new RelayCommand(OpenDllExecuted, OpenDllCanExecute)); }
    }
    
            //...
    
    // decides, when the <OpenDll> button is enabled or not
    private bool OpenDllCanExecute(object obj)
    {
        return true; // always true for Open DLL button
    }
    
            //...
    
    // in fact, handler
    private void OpenDllExecuted(object obj)
    {
        var openDlg = new OpenFileDialog { ... };
        _pathToDll = openDlg.FileName;
        _exporter.PathToDll = _pathToDll;
                    // Notifying TreeView via binding that the property <Fixtures> has been changed,
                    // thereby forcing the tree to refresh itself
        OnPropertyChanged("Fixtures");
    }
    
    1. Final UI (but not final for me, a lot of things should be done!). Extended WPF toolkit was used somewhere: http://wpftoolkit.codeplex.com/

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

SEE BOTTOM OF THIS POST FOR UPDATE ON THIS PLEASE. I have the below
see fiddle Firstly i am new to jquery. i have to make one cell
This exercise was a bit tricky. Figured I'd post my solution to see if
I tried looking at this post which has an almost identical title but despite
I've been looking at this SO Post in an effort to understand processing query
This is my second post about hibernate. Since I started using hibernate it has
I've built a modal image gallery. When the user clicks next to see next
When I see a red exclamation mark in Eclipse next to my project name,
I want to see a list of all changes the next push would do.
guys, I would like to you evaluate next code below. As you see, I

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.