View의 발표자의 Code-Behind에서 메소드를 호출 할 수없는 이유는 무엇입니까?

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();

다른 팁

보기는 분명히 프레임 워크 라이멘트와 같은 일부 기본 유형입니다. 이 코드를 시도하십시오 :

SmartFormView myView = new SmartFormView();

View = myView;

myView.BeforeLoad();

PresenterBase 클래스를 표시하지는 않지만 PresenterBase.View 속성은 아마도 SmartFormView 유형이 아닐 것입니다. 나는 그것이 어떤 유형인지 잘 모르겠지만 Usercontrol 또는 조상 중 하나를 추측하고 있습니다.

몇 가지 옵션은 다음과 같습니다.

  1. 모든 뷰에 대한 기본 클래스를 만들고, 기본 클래스에 가상 BeforeLoad 메소드를 넣고 PresenterBase의 View 속성을 해당 유형으로 만드십시오.
  2. Martin이 제안한 것처럼 typecast를 삽입하십시오 (이것은 솔루션보다 해킹에 더 가깝습니다).
  3. SmartFormPresenter에서 View 속성이 실제로보기에 기본 클래스를 일반으로 만들어 ~할 수 있다 SmartFormView 유형입니다. 예 :

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top