C# 为什么可以';t我调用我视图中的方法';从视图';主持人是谁?

C# 为什么可以';t我调用我视图中的方法';从视图';主持人是谁?,c#,wpf,mvp,C#,Wpf,Mvp,这是我的观点背后的代码: using System.Windows.Controls; namespace TestBoundTabControl.Views { public partial class SmartFormView : UserControl { public SmartFormView() { InitializeComponent(); } public void B

这是我的观点背后的代码:

using System.Windows.Controls;

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

        public void BeforeLoad()
        {
            MainTabControl.SelectedIndex = MainTabControl.Items.Count - 1;
        }
    }
}
但是为什么我不能从视图的演示者访问“BeforeLoad()”方法?

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

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Linq;
使用系统文本;
使用TestBoundTabControl.Views;
命名空间TestBoundTabControl.Presenters
{
公共类SmartFormPresenter:PresenterBase
{
#区域ViewModelProperty:SmartFormAreaPresenters
私有ObservableCollection_smartFormAreaPresenters=新ObservableCollection();
公众可观察收集SmartFormarePresenters
{
得到
{
返回(SmartFormaraPresenters);;
}
设置
{
_smartFormAreaPresenters=值;
OnPropertyChanged(“SmartFormAreaPresenters”);
}
}
#端区
公共SmartFormPresenter()
{
视图=新的SmartFormView();
View.DataContext=this;
对于(int i=0;i<5;i++)
{
添加(新的SmartFormAreaPresenter());
}
View.BeforeLoad();//未找到方法
}
}
}

我猜属性
视图
的类型是
用户控件
,而不是
智能表单视图
。如果这是真的,您将不得不强制转换它(或更改它的类型):


视图显然是一些基本类型,比如FrameworkElement。请尝试以下代码:

SmartFormView myView = new SmartFormView();

View = myView;

myView.BeforeLoad();

您不显示PresenterBase类,但PresenterBase.View属性可能不是SmartFormView类型。我不确定它是什么类型,但我猜是UserControl还是它的祖先之一

以下是一些选项:

  • 为所有视图创建一个基类,在该基类上放置一个virtual BeforeLoad方法,并使PresenterBase的视图属性为该类型
  • 按照Martin的建议,插入一个类型转换(这与其说是一个解决方案,不如说是一个黑客)
  • 将基类设置为视图类型的泛型,以便在SmartFormPresenter中,view属性的类型可以是SmartFormView。例如:

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
    公共类PresenterBase{
    ...
    公共T视图{get;set;}
    ...
    
  • public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...