Pourquoi ne puis-je pas appeler une méthode dans le code-behind de ma vue à partir du présentateur de la vue?
Question
Il s'agit du code-behind de ma vue:
using System.Windows.Controls;
namespace TestBoundTabControl.Views
{
public partial class SmartFormView : UserControl
{
public SmartFormView()
{
InitializeComponent();
}
public void BeforeLoad()
{
MainTabControl.SelectedIndex = MainTabControl.Items.Count - 1;
}
}
}
Mais pourquoi ne puis-je pas accéder à la méthode " BeforeLoad () " du présentateur de la vue?
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
}
}
}
La solution
Je suppose que la propriété View
a le type UserControl
et non SmartFormView
. Si cela est vrai, vous devrez le lancer (ou en changer le type):
((SmartFormView) View).BeforeLoad();
Autres conseils
La vue est évidemment d'un type de base, comme FrameworkElement. Essayez ce code:
SmartFormView myView = new SmartFormView();
View = myView;
myView.BeforeLoad();
Vous n'indiquez pas votre classe PresenterBase, mais la propriété PresenterBase.View n'est probablement pas de type SmartFormView. Je ne sais pas de quel type il s'agit, mais j'imagine que UserControl ou l'un de ses ancêtres.
Voici quelques options:
- Créez une classe de base pour toutes vos vues, placez une méthode BeforeLoad virtuelle sur cette classe de base et définissez la propriété View de votre PresenterBase sur ce type.
- Insérez une conversion de type, comme l'a suggéré Martin (il s'agit davantage d'un bidouillage que d'une solution, à mon humble avis).
-
Créez votre classe de base générique sur le type de vue, afin que dans SmartFormPresenter, la propriété View puisse réellement être de type SmartFormView. Exemple:
public class PresenterBase<T> { ... public T View { get; set; } ...