Почему я не могу вызвать метод в коде моего представления от докладчика представления?

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 или один из его предков.

Вот несколько вариантов:

<Ол>
  • Создайте базовый класс для всех ваших представлений, поместите виртуальный метод BeforeLoad в этот базовый класс и сделайте свойство View вашего PresenterBase того же типа.
  • Вставьте Typecast, как предложил Мартин (это скорее взлом, чем решение, ИМХО).
  • Сделайте ваш базовый класс универсальным для типа представления, чтобы в SmartFormPresenter свойство View действительно могло иметь тип SmartFormView. Например:.

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top