¿Por qué no puedo llamar a un método en el código subyacente de mi Vista desde el presentador de la vista?
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
}
}
}
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:
- 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.
- Inserte un texto, como sugirió Martin (esto es más un truco que una solución, en mi humilde opinión).
-
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; } ...