为什么我无法从视图的演示者调用视图代码隐藏中的方法?

StackOverflow https://stackoverflow.com/questions/1227226

  •  22-07-2019
  •  | 
  •  

这是 代码隐藏 我的观点:

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 或其祖先之一。

以下是一些选项:

  1. 为所有视图创建一个基类,在该基类上放置一个虚拟 BeforeLoad 方法,并使 PresenterBase 的 View 属性属于该类型。
  2. 正如马丁建议的那样,插入一个类型转换(恕我直言,这更像是一种黑客而不是解决方案)。
  3. 使您的基类在视图类型上通用,以便在 SmartFormPresenter 中,View 属性真正 属于 SmartFormView 类型。例如。:

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top