لماذا لا يمكنني استدعاء أسلوب في عرض التعليمات البرمجية-خلف من المنظر مذيعا ؟

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.عرض الملكية ربما ليس من نوع SmartFormView.أنا لست متأكدا من أي نوع هو ، ولكن انا التخمين UserControl أو أحد أجداده.

وهنا بعض الخيارات:

  1. جعل قاعدة الطبقة لجميع وجهات النظر الخاصة بك ، ووضع الظاهري BeforeLoad الطريقة على قاعدة الطبقة ، PresenterBase عرض العقار تكون من هذا النوع.
  2. إدراج التلبيس ، كما اقترح مارتن (وهذا هو أكثر من هاك من الحل ، IMHO).
  3. جعل قاعدة الطبقة العامة على عرض نوع ، حتى أنه في SmartFormPresenter ، عرض الملكية حقا يمكن يكون من نوع SmartFormView.E. g.:

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top