Pourquoi ne puis-je pas appeler une méthode dans le code-behind de ma vue à partir du présentateur de la vue?

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

  •  22-07-2019
  •  | 
  •  

Question

Il s'agit du code-behind de ma vue:

using System.Windows.Controls;

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

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

Mais pourquoi ne puis-je pas accéder à la méthode " BeforeLoad () " du présentateur de la vue?

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

        }
    }
}
Était-ce utile?

La solution

Je suppose que la propriété View a le type UserControl et non SmartFormView . Si cela est vrai, vous devrez le lancer (ou en changer le type):

((SmartFormView) View).BeforeLoad();

Autres conseils

La vue est évidemment d'un type de base, comme FrameworkElement. Essayez ce code:

SmartFormView myView = new SmartFormView();

View = myView;

myView.BeforeLoad();

Vous n'indiquez pas votre classe PresenterBase, mais la propriété PresenterBase.View n'est probablement pas de type SmartFormView. Je ne sais pas de quel type il s'agit, mais j'imagine que UserControl ou l'un de ses ancêtres.

Voici quelques options:

  1. Créez une classe de base pour toutes vos vues, placez une méthode BeforeLoad virtuelle sur cette classe de base et définissez la propriété View de votre PresenterBase sur ce type.
  2. Insérez une conversion de type, comme l'a suggéré Martin (il s'agit davantage d'un bidouillage que d'une solution, à mon humble avis).
  3. Créez votre classe de base générique sur le type de vue, afin que dans SmartFormPresenter, la propriété View puisse réellement être de type SmartFormView. Exemple:

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top