¿Por qué no puedo llamar a un método en el código subyacente de mi Vista desde el presentador de la vista?

StackOverflow https://stackoverflow.com/questions/1227226

  •  22-07-2019
  •  | 
  •  

Pregunta

Este es el código subyacente de mi vista:

using System.Windows.Controls;

namespace TestBoundTabControl.Views
{
    public partial class SmartFormView : UserControl
    {
        public SmartFormView()
        {
            InitializeComponent();
        }

        public void BeforeLoad()
        {
            MainTabControl.SelectedIndex = MainTabControl.Items.Count - 1;
        }
    }
}

Pero ¿por qué no puedo acceder al método " BeforeLoad () " del presentador de la vista?

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using TestBoundTabControl.Views;

namespace TestBoundTabControl.Presenters
{
    public class SmartFormPresenter : PresenterBase
    {
        #region ViewModelProperty: SmartFormAreaPresenters
        private ObservableCollection<SmartFormAreaPresenter> _smartFormAreaPresenters = new ObservableCollection<SmartFormAreaPresenter>();
        public ObservableCollection<SmartFormAreaPresenter> SmartFormAreaPresenters
        {
            get
            {
                return _smartFormAreaPresenters;
            }

            set
            {
                _smartFormAreaPresenters = value;
                OnPropertyChanged("SmartFormAreaPresenters");
            }
        }
        #endregion

          public SmartFormPresenter()
        {
            View = new SmartFormView();
            View.DataContext = this;


            for (int i = 0; i < 5; i++)
            {
                SmartFormAreaPresenters.Add(new SmartFormAreaPresenter());
            }

            View.BeforeLoad(); //method not found

        }
    }
}
¿Fue útil?

Solución

Supongo que la propiedad Ver tiene el tipo UserControl y no SmartFormView . Si eso es cierto, tendrá que lanzarlo (o cambiar su tipo):

((SmartFormView) View).BeforeLoad();

Otros consejos

La vista es obviamente de algún tipo base, como FrameworkElement. Pruebe este código:

SmartFormView myView = new SmartFormView();

View = myView;

myView.BeforeLoad();

No muestra su clase PresenterBase, pero la propiedad PresenterBase.View probablemente no sea del tipo SmartFormView. No estoy seguro de qué tipo es, pero supongo que UserControl o uno de sus antepasados.

Aquí hay algunas opciones:

  1. Cree una clase base para todas sus Vistas, coloque un método virtual BeforeLoad en esa clase base y haga que su propiedad View de PresenterBase sea de ese tipo.
  2. Inserte un texto, como sugirió Martin (esto es más un truco que una solución, en mi humilde opinión).
  3. Haga que su clase base sea genérica en el tipo de vista, de modo que en SmartFormPresenter, la propiedad Ver realmente pueda ser del tipo SmartFormView. Por ejemplo:

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top