Почему я не могу вызвать метод в коде моего представления от докладчика представления? - PullRequest
0 голосов
/ 04 августа 2009

Это код моего взгляда:

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

        }
    }
}

Ответы [ 3 ]

1 голос
/ 04 августа 2009

Я предполагаю, что свойство View имеет тип UserControl, а не SmartFormView. Если это правда, вам придется разыграть его (или изменить его тип):

((SmartFormView) View).BeforeLoad();
0 голосов
/ 04 августа 2009

Вы не показываете свой класс PresenterBase, но свойство PresenterBase.View, вероятно, не относится к типу SmartFormView. Я не уверен, что это за тип, но я предполагаю, что UserControl или один из его предков.

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

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

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
0 голосов
/ 04 августа 2009

Представление, очевидно, имеет некоторый базовый тип, например FrameworkElement. Попробуйте этот код:

SmartFormView myView = new SmartFormView();

View = myView;

myView.BeforeLoad();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...