Por que não posso chamar um método na minha tela de code-behind do apresentador do ponto de vista?

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

  •  22-07-2019
  •  | 
  •  

Pergunta

Este é o code-behind do meu ponto de vista:

using System.Windows.Controls;

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

        public void BeforeLoad()
        {
            MainTabControl.SelectedIndex = MainTabControl.Items.Count - 1;
        }
    }
}

Mas por que não posso acessar o método "BeforeLoad ()" do apresentador do ponto de vista?

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

        }
    }
}
Foi útil?

Solução

Meu palpite é que a propriedade View tem o tipo UserControl e não SmartFormView. Se isso for verdade você terá que lançá-lo (ou alterá-la de tipo):

((SmartFormView) View).BeforeLoad();

Outras dicas

Ver é, obviamente, de algum tipo de base, como FrameworkElement. Tente este código:

SmartFormView myView = new SmartFormView();

View = myView;

myView.BeforeLoad();

Você não mostrar sua classe PresenterBase, mas a propriedade PresenterBase.View provavelmente não é do tipo SmartFormView. Eu não tenho certeza de que tipo é, mas eu estou supondo UserControl ou um de seus antepassados.

Aqui estão algumas opções:

  1. Faça uma classe base para todos os seus pontos de vista, coloque um método BeforeLoad virtual em que a classe base, e fazer a sua propriedade View do PresenterBase ser desse tipo.
  2. Insira um typecast, como Martin sugeriu (este é mais um truque do que uma solução, IMHO).
  3. Faça sua classe base genérica sobre o tipo de vista, de modo que em SmartFormPresenter, a propriedade View realmente pode ser do tipo SmartFormView. Por exemplo:.

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top