لماذا لا يمكنني استدعاء أسلوب في عرض التعليمات البرمجية-خلف من المنظر مذيعا ؟
سؤال
هذا هو التعليمات البرمجية-خلف من وجهة نظري:
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 أو أحد أجداده.
وهنا بعض الخيارات:
- جعل قاعدة الطبقة لجميع وجهات النظر الخاصة بك ، ووضع الظاهري BeforeLoad الطريقة على قاعدة الطبقة ، PresenterBase عرض العقار تكون من هذا النوع.
- إدراج التلبيس ، كما اقترح مارتن (وهذا هو أكثر من هاك من الحل ، IMHO).
جعل قاعدة الطبقة العامة على عرض نوع ، حتى أنه في SmartFormPresenter ، عرض الملكية حقا يمكن يكون من نوع SmartFormView.E. g.:
public class PresenterBase<T> { ... public T View { get; set; } ...
لا تنتمي إلى StackOverflow