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 3443072
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 18, 20262026-05-18T08:44:48+00:00 2026-05-18T08:44:48+00:00

I’m developing a WinForms application in C#. I have limited experience in GUI programming,

  • 0

I’m developing a WinForms application in C#. I have limited experience in GUI programming, and I am having to learn a great deal on the fly. That being said, here’s what I am building.

See the general GUI look at the following link:

GUI http://img227.imageshack.us/img227/1084/program0.jpg

Now, I have done a lot of the work already, but in the very bad Autonomous design pattern. I did not know the project would ever reach a certain size, and, as such, it is time to do some major refactoring.

I have been studying a great deal about GUI design patterns, and the pattern I am wishing to implement is the Passive View (see http://martinfowler.com/eaaDev/PassiveScreen.html). I am looking for some help on how to bring this all together.

Background:

1) Depending on what the user clicks in the “TreeView”, the “List” in the bottom left-hand corner will display a list of objects that can populate the “Editor” area. These objects might be a TextBox or a DataGridView. The user toggles the List to choose what he/she wants to see in the “Editor”

2) The model is essentially a folder with data and configuration files. There is an external program that runs on a given directory, creates output files/folders, etc. This program I am developing is designed to effectively manage/configure these objects in a user-friendly way

3) The problem with the way I have been doing things is that it is next to impossible to test, and hence the move to the MVP-esque Passive View design pattern

I am trying to make it so that the program works independently of the View. I have not been able to find any examples where a more complex, interactive view is used with the Passive View pattern.

Questions:

1) Do I need to implement one large interface/view for the entire “look” of the program, then implement sub-interfaces/sub-views for each of the TreeView, Editor, Logger, etc.? Or is there a better “structure” to doing this?

2) When it comes to “handing off” events from the View to the Presenter/Controller (whatever terminology you wish to use W.R.T. the Passive View design pattern), what is the way I should be doing this? Sometimes I have simple properties that need to be updated, and sometimes I need a whole series of steps to unfold.

I would love suggestions and advice on this topic. I have scoured the Internet, and I haven’t found adequate examples to help me continue with this project.

Thanks in advance!

Daniel

  • 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-05-18T08:44:49+00:00Added an answer on May 18, 2026 at 8:44 am

    Here is a simple example that demonstrates the concept of passive views using the MVP design pattern. Because we are using passive views the view has no knowledge of the presenter. The presenter will simply subscribe to events published by the view and act accordingly.

    To start out we need to define a contract for our view. This is typically achieved using an interface, essentially, we want to have a very loose coupling with our view. We want the ability to switch to different views or event create mock views for unit testing.

    Here is a contract that describes a simple view that will be used to display customer information

    public interface ICustomerManagementView
    {
        void InitializeCustomers(ICustomer[] customers);
        void DisplayCustomer(ICustomer customer);
        event EventHandler<EventArgs<ICustomer>> SelectedCustomerChanged;
    }
    

    It exposes a single method InitializeCustomers that will be used to initialize our view with objects from our model.

    We also have an event SelectedCustomerChanged that will be used by our presenter to receive notification that an action has occurred in the view.

    Once we have our contract we can start to handle these interactions in our presenter.

    public class CustomerManagementPresenter
    {
        private ICustomer _selectedCustomer;
        private readonly ICustomerManagementView _managementView;
        private readonly ICustomerRepository _customerRepository;
    
        public CustomerManagementPresenter(ICustomerManagementView managementView, ICustomerRepository customerRepository)
        {
            _managementView = managementView;
            _managementView.SelectedCustomerChanged += this.SelectedCustomerChanged;
    
            _customerRepository = customerRepository;
    
            _managementView.InitializeCustomers(_customerRepository.FetchCustomers());
        }
    
        private void SelectedCustomerChanged(object sender, EventArgs<ICustomer> args)
        {
            // Perform some logic here to update the view
            if(_selectedCustomer != args.Value)
            {
                _selectedCustomer = args.Value;
                _managementView.DisplayCustomer(_selectedCustomer);
            }
        }
    }
    

    In the presenter we can use another design pattern called dependency injection to provide access to our view and any model classes that we may need. In this example I have a CustomerRepository that is responsible for fetching customer details.

    In the constructor we have two important lines of code, firstly we have subscribed to the SelectedCustomerChanged event in our view, it is here that we can perform associated actions. Secondly we have called InitilaizeCustomers with data from the repository.

    At this point we haven’t actually defined a concrete implementation for our view, all we need to do is create an object that implements ICustomerManagementView. For example in a Windows Forms application we can do the following

    public partial class CustomerManagementView : Form, ICustomerManagementView
    {
        public CustomerManagementView()
        {
            this.InitializeComponents();
        }
    
        public void InitializeCustomers(ICustomer[] customers)
        {
            // Populate the tree view with customer details
        }
    
        public void DisplayCustomer(ICustomer customer)
        {
            // Display the customer...
        }
    
        // Event handler that responds to node selection
        private void CustomerTreeViewAfterSelect(object sender, TreeViewEventArgs e)
        {
            var customer = e.Node.Tag as ICustomer;
            if(customer != null)
            {
                this.OnSelectedCustomerChanged(new EventArgs<ICustomer>(customer));
            }
        }
    
        // Protected method so that we can raise our event
        protected virtual void OnSelectedCustomerChanged(EventArgs<ICustomer> args)
        {
            var eventHandler = this.SelectedCustomerChanged;
            if(eventHandler != null)
            {
                eventHandler.Invoke(this, args);
            }
        }
    
        // Our view will raise an event each time the selected customer changes
        public event EventHandler<EventArgs<ICustomer>> SelectedCustomerChanged;
    }
    

    If we wanted to test our presentation logic we could mock our view and perform some assertions.

    EDIT : Included custom event args

    public class EventArgs<T> : EventArgs
    {
        private readonly T _value;
    
        public EventArgs(T value)
        {
            _value = value;
        }
    
        public T Value
        {
            get { return _value; }
        }
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

No related questions found

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.