Warum kann nicht nenne ich eine Methode in meiner Ansicht der Code-Behind aus der Moderator Ansicht?

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

  •  22-07-2019
  •  | 
  •  

Frage

Dies ist der Code-behind aus meiner Sicht:

using System.Windows.Controls;

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

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

Aber warum kann ich nicht auf die Methode "BeforeLoad ()" aus der Moderator Ansicht?

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

        }
    }
}
War es hilfreich?

Lösung

Meine Vermutung ist, dass die Eigenschaft View hat UserControl und nicht SmartFormView geben. Wenn das wahr ist, werden Sie es werfen (oder seine Art aus):

((SmartFormView) View).BeforeLoad();

Andere Tipps

Ansicht ist offensichtlich von einigen Basistyp, wie Framework. Versuchen Sie diesen Code ein:

SmartFormView myView = new SmartFormView();

View = myView;

myView.BeforeLoad();

Sie zeigen nicht Ihre PresenterBase Klasse, aber die PresenterBase.View Eigenschaft wahrscheinlich ist nicht vom Typ SmartFormView. Ich bin mir nicht sicher, welche Art es ist, aber ich nehme an Usercontrol oder eines seiner Vorfahren.

Hier sind einige Möglichkeiten:

  1. Erstellen Sie eine Basisklasse für alle Ihre Ansichten, setzen Sie auf dieser Basisklasse eine virtuelle BeforeLoad Methode und Ihre PresenterBase anzeigen Eigenschaft dieser Art sein, machen.
  2. eine Typumwandlung einlegen, wie Martin vorgeschlagen (dies ist eher ein Hack als eine Lösung, IMHO).
  3. Machen Sie Ihre Basisklasse auf dem Ansichtstyp generisch, so dass in SmartFormPresenter, die View-Eigenschaft kann wirklich vom Typ SmartFormView sein. Z.

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top