簡體   English   中英

為什么我不能在視圖的演示者背后的視圖代碼中調用方法?

[英]Why can't I call a method in my View's code-behind from the view's presenter?

這是我觀點的代碼背后

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. 為所有View創建一個基類,在該基類上放置一個虛擬的BeforeLoad方法,並使PresenterBase的View屬性為該類型。
  2. 按照Martin的建議插入類型轉換(恕我直言,這比解決方案更像是一種技巧)。
  3. 使您的基類對視圖類型通用,以便在SmartFormPresenter中,View屬性實際上可以是SmartFormView類型。 例如:

     public class PresenterBase<T> { ... public T View { get; set; } ... 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM