题
这是 代码隐藏 我的观点:
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
}
}
}
解决方案
我的猜测是,属性View
具有类型UserControl
和不SmartFormView
。如果这是真的,你将不得不投它(或改变它的类型):
((SmartFormView) View).BeforeLoad();
其他提示
查看显然有些基本类型的,像FrameworkElement的。尝试这种代码:
SmartFormView myView = new SmartFormView();
View = myView;
myView.BeforeLoad();
您没有显示 PresenterBase 类,但 PresenterBase.View 属性可能不是 SmartFormView 类型。我不确定它是什么类型,但我猜测 UserControl 或其祖先之一。
以下是一些选项:
- 为所有视图创建一个基类,在该基类上放置一个虚拟 BeforeLoad 方法,并使 PresenterBase 的 View 属性属于该类型。
- 正如马丁建议的那样,插入一个类型转换(恕我直言,这更像是一种黑客而不是解决方案)。
使您的基类在视图类型上通用,以便在 SmartFormPresenter 中,View 属性真正 能 属于 SmartFormView 类型。例如。:
public class PresenterBase<T> { ... public T View { get; set; } ...
不隶属于 StackOverflow