2013-08-19 5 views
0

У меня возникло странное & неудобная проблема, передающая объект между некоторыми моими классами. Это связано с тем, что я сценарист, а не программист, и я просто неуклюже. Поэтому я уверен, что делаю что-то немое :)передать данные конструктору

Я пытаюсь создать диалог мастера, который имеет несколько страниц. Я использую учебник «Интернационализированный WPF Wizard» из CodeProject в качестве отправной точки и пытаюсь адаптировать его к моему домену. Я застрял, потому что мои страницы мастера не могут ссылаться на модель.

Я сделал следующее:

  • создал класс для моей модели (пусть называют эту MyData)
  • создал базовый класс для моих моделей зрения (ViewModelBase)
  • Created вид модели класса для каждой моей страницы, наследующей от ViewModelBase (пример ниже - WelcomePageViewModel)
  • Создал модель стиля стиля «контроллер», которая управляет мастером. (WizardController)

При запуске мастера создается экземпляр WizardController. WizardController также запускает MyData.Then, WizardController создает экземпляр каждой модели просмотра для оставшихся страниц.

Фактический графический интерфейс пользователя работает нормально, и я вижу, что модели просмотра для каждой из страниц загружаются правильно. Вот код:

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()); 
    } 
} 

Однако мой код не выполняется при попытке получить доступ к MyData из WelcomePageViewModel. На строке MyLogger в WelcomePageViewModel выдается ошибка «Ссылка на объект, не установленная на экземпляр объекта».

В принципе, все, чего я пытаюсь достичь, это WizardController, устанавливающий MyData, и каждая из страниц мастера может получить доступ (и манипулировать) им. Поэтому любое руководство будет принята с благодарностью!

+1

Где код, который обращается к 'WelcomePageViewModel' объекта? Где хранится 'WelcomePageViewModel'? –

+0

Если вы объявляете это в абстрактном классе, почему вы затем обновляете его в реальных реализованных классах? Кроме того, вы захотите, чтобы это было защищено, а не частное, если вы хотите получить к нему доступ в наследующем классе. Если вам необходимо переопределить его, используйте виртуальные и переопределяющие ключевые слова. –

ответ

0

Как сказал Роб в комментарии, вы повторно объявляете переменную _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()); 
    } 
} 

Edit: исправлена ​​ошибка копирования вставки ...

+0

Спасибо, хавардху! Это было место! – Timothy

Смежные вопросы