Por que não posso chamar um método na minha tela de code-behind do apresentador do ponto de vista?
Pergunta
Este é o code-behind do meu ponto de 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;
}
}
}
Mas por que não posso acessar o método "BeforeLoad ()" do apresentador do ponto de 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
}
}
}
Solução
Meu palpite é que a propriedade View
tem o tipo UserControl
e não SmartFormView
. Se isso for verdade você terá que lançá-lo (ou alterá-la de tipo):
((SmartFormView) View).BeforeLoad();
Outras dicas
Ver é, obviamente, de algum tipo de base, como FrameworkElement. Tente este código:
SmartFormView myView = new SmartFormView();
View = myView;
myView.BeforeLoad();
Você não mostrar sua classe PresenterBase, mas a propriedade PresenterBase.View provavelmente não é do tipo SmartFormView. Eu não tenho certeza de que tipo é, mas eu estou supondo UserControl ou um de seus antepassados.
Aqui estão algumas opções:
- Faça uma classe base para todos os seus pontos de vista, coloque um método BeforeLoad virtual em que a classe base, e fazer a sua propriedade View do PresenterBase ser desse tipo.
- Insira um typecast, como Martin sugeriu (este é mais um truque do que uma solução, IMHO).
-
Faça sua classe base genérica sobre o tipo de vista, de modo que em SmartFormPresenter, a propriedade View realmente pode ser do tipo SmartFormView. Por exemplo:.
public class PresenterBase<T> { ... public T View { get; set; } ...