ビューのプレゼンターからビューのコードビハインドでメソッドを呼び出せないのはなぜですか?

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 プロパティのタイプは SmartFormView ではなく UserControl であると推測します。それが当てはまる場合は、キャストする(またはタイプを変更する)必要があります:

((SmartFormView) View).BeforeLoad();

他のヒント

Viewは、FrameworkElementのようなベースタイプであることは明らかです。このコードを試してください:

SmartFormView myView = new SmartFormView();

View = myView;

myView.BeforeLoad();

PresenterBaseクラスは表示しませんが、PresenterBase.ViewプロパティはおそらくSmartFormView型ではありません。どんな型なのかはわかりませんが、UserControlまたはその祖先の1つを推測しています。

いくつかのオプションがあります:

  1. すべてのビューの基本クラスを作成し、その基本クラスに仮想BeforeLoadメソッドを配置して、PresenterBaseのViewプロパティをそのタイプにします。
  2. Martinが示唆したように、タイプキャストを挿入します(これは、ソリューションというよりはハックです、私見)。
  3. ビュータイプの基本クラスをジェネリックにし、SmartFormPresenterでViewプロパティをSmartFormViewタイプにすることができます。例:

    public class PresenterBase<T> {
        ...
        public T View { get; set; }
        ...
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top