2009-08-04 41 views
0

这是我的看法的代码隐藏为什么我不能从视图的演示者中调用View的代码隐藏方法?

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 

     } 
    } 
} 

回答

1

我的猜测是,财产View的类型为UserControl而不是SmartFormView。如果这是真的,你将不得不抛弃它(或改变它的类型):

((SmartFormView) View).BeforeLoad(); 
0

查看显然是一些基本类型,如FrameworkElement。试试这个代码:

SmartFormView myView = new SmartFormView(); 

View = myView; 

myView.BeforeLoad(); 
0

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

这里有一些选择:

  1. 让您的所有视图的基类,把一个虚拟BeforeLoad方法对基类,并让您的PresenterBase的视图属性是此类型。
  2. 按照Martin的建议插入一个类型转换(这更像是一种黑客,而不是解决方案,恕我直言)。
  3. 使您的基类在视图类型上是通用的,这样在SmartFormPresenter中,View属性可以是的类型为SmartFormView。例如:

    public class PresenterBase<T> { 
        ... 
        public T View { get; set; } 
        ... 
    
相关问题