ビューのプレゼンターからビューのコードビハインドでメソッドを呼び出せないのはなぜですか?
質問
これは私のビューの分離コードです:
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
プロパティのタイプは SmartFormView
ではなく UserControl
であると推測します。それが当てはまる場合は、キャストする(またはタイプを変更する)必要があります:
((SmartFormView) View).BeforeLoad();
他のヒント
Viewは、FrameworkElementのようなベースタイプであることは明らかです。このコードを試してください:
SmartFormView myView = new SmartFormView();
View = myView;
myView.BeforeLoad();
PresenterBaseクラスは表示しませんが、PresenterBase.ViewプロパティはおそらくSmartFormView型ではありません。どんな型なのかはわかりませんが、UserControlまたはその祖先の1つを推測しています。
いくつかのオプションがあります:
- すべてのビューの基本クラスを作成し、その基本クラスに仮想BeforeLoadメソッドを配置して、PresenterBaseのViewプロパティをそのタイプにします。
- Martinが示唆したように、タイプキャストを挿入します(これは、ソリューションというよりはハックです、私見)。
-
ビュータイプの基本クラスをジェネリックにし、SmartFormPresenterでViewプロパティをSmartFormViewタイプにすることができます。例:
public class PresenterBase<T> { ... public T View { get; set; } ...
所属していません StackOverflow