View의 발표자의 Code-Behind에서 메소드를 호출 할 수없는 이유는 무엇입니까?
문제
이것이 코드-하인 내 견해의 :
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 또는 조상 중 하나를 추측하고 있습니다.
몇 가지 옵션은 다음과 같습니다.
- 모든 뷰에 대한 기본 클래스를 만들고, 기본 클래스에 가상 BeforeLoad 메소드를 넣고 PresenterBase의 View 속성을 해당 유형으로 만드십시오.
- Martin이 제안한 것처럼 typecast를 삽입하십시오 (이것은 솔루션보다 해킹에 더 가깝습니다).
SmartFormPresenter에서 View 속성이 실제로보기에 기본 클래스를 일반으로 만들어 ~할 수 있다 SmartFormView 유형입니다. 예 :
public class PresenterBase<T> { ... public T View { get; set; } ...
제휴하지 않습니다 StackOverflow