Warum kann nicht nenne ich eine Methode in meiner Ansicht der Code-Behind aus der Moderator Ansicht?
Frage
Dies ist der Code-behind aus meiner Sicht:
using System.Windows.Controls;
namespace TestBoundTabControl.Views
{
public partial class SmartFormView : UserControl
{
public SmartFormView()
{
InitializeComponent();
}
public void BeforeLoad()
{
MainTabControl.SelectedIndex = MainTabControl.Items.Count - 1;
}
}
}
Aber warum kann ich nicht auf die Methode "BeforeLoad ()" aus der Moderator Ansicht?
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
}
}
}
Lösung
Meine Vermutung ist, dass die Eigenschaft View
hat UserControl
und nicht SmartFormView
geben. Wenn das wahr ist, werden Sie es werfen (oder seine Art aus):
((SmartFormView) View).BeforeLoad();
Andere Tipps
Ansicht ist offensichtlich von einigen Basistyp, wie Framework. Versuchen Sie diesen Code ein:
SmartFormView myView = new SmartFormView();
View = myView;
myView.BeforeLoad();
Sie zeigen nicht Ihre PresenterBase Klasse, aber die PresenterBase.View Eigenschaft wahrscheinlich ist nicht vom Typ SmartFormView. Ich bin mir nicht sicher, welche Art es ist, aber ich nehme an Usercontrol oder eines seiner Vorfahren.
Hier sind einige Möglichkeiten:
- Erstellen Sie eine Basisklasse für alle Ihre Ansichten, setzen Sie auf dieser Basisklasse eine virtuelle BeforeLoad Methode und Ihre PresenterBase anzeigen Eigenschaft dieser Art sein, machen.
- eine Typumwandlung einlegen, wie Martin vorgeschlagen (dies ist eher ein Hack als eine Lösung, IMHO).
-
Machen Sie Ihre Basisklasse auf dem Ansichtstyp generisch, so dass in SmartFormPresenter, die View-Eigenschaft kann wirklich vom Typ SmartFormView sein. Z.
public class PresenterBase<T> { ... public T View { get; set; } ...