0

一部のクラス間でオブジェクトを渡す際に、奇妙で苛立たしい問題が発生しています。これは、私がスクリプターであってプログラマーではないという事実に由来します。だから私は何か愚かなことをしていると確信しています:)

複数のページを持つウィザード ダイアログを作成しようとしています。CodeProject の「Internationalized WPF Wizard」チュートリアルを出発点として使用し、それを自分のドメインに適応させようとしています。ウィザード ページがモデルを参照できないように見えるため、行き詰まりました。

私は次のことをしました:

  • モデルのクラスを作成しました (これを MyData と呼びましょう)
  • ビュー モデル (ViewModelBase) の基本クラスを作成しました
  • ViewModelBase から継承して、各ページのビュー モデル クラスを作成しました (以下の例は WelcomePageViewModel です)。
  • ウィザードを駆動する「コントローラー」スタイルのビュー モデルを作成しました。(ウィザードコントローラー)

ウィザードが起動されると、WizardController がインスタンス化されます。WizardController は MyData もインスタンス化します。次に、WizardController は残りのページの各ビュー モデルをインスタンス化します。

実際の G​​UI は問題なく動作しているようで、各ページのビュー モデルが正しく読み込まれていることがわかります。ここにいくつかのコードがあります:

public class MyData
{
    private string _someString;
    public MyData(string someString)
    {
        _someString = someString;
    }
}

public abstract class ViewModelBase : INotifyPropertyChanged
{
    bool _isCurrentPage;
    readonly MyData _myData;
    public ViewModelBase(MyData myData)
    {
        _myData = myData;
    }
}

public class WizardController : INotifyPropertyChanged
{
    MyData _myData;
    public WizardController()
    {

        _myData = new MyData("The Widgets");
    }
}


public class WelcomePageViewModel : ViewModelBase
{
    private MyData _myData;

    public WelcomePageViewModel(MyData myData)
        : base(myData)
    {
        _myData = myData;
        // accessing _myData fails :(
        MyLogger.WriteLine("Grabbed an instance of myData: " + _myData.ToString());
    }
}

ただし、WelcomePageViewModel から myData にアクセスしようとすると、コードが失敗します。WelcomePageViewModel の MyLogger 行に、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。投げられます。

基本的に、私が達成しようとしているのは、WizardController が MyData を設定し、各ウィザード ページが MyData にアクセス (および操作) できるようにすることだけです。ですから、どんなガイダンスも大歓迎です!

4

1 に答える 1

0

Rob G がコメントで提案したように、継承されたクラスで変数 _myData を再宣言しています。コードを編成する正しい方法は、_myData を抽象基本クラスでのみ宣言された保護されたプロパティにし、このプロパティを使用して継承クラスから変数にアクセスすることです。

public abstract class ViewModelBase : INotifyPropertyChanged
{
    bool _isCurrentPage;

    protected MyData MyData { get; private set; }

    public ViewModelBase(MyData myData)
    {
        MyData = myData;
    }
}

public class WelcomePageViewModel : ViewModelBase
{  
    public WelcomePageViewModel(MyData myData)
        : base(myData)
    {
       // Access the protected property
       MyLogger.WriteLine("Grabbed an instance of myData: " + MyData.ToString());
    }
}

編集:コピペエラーを修正...

于 2013-08-19T23:06:49.740 に答える