2016-11-01 2 views
0

У меня есть основной вид с вложенными дочерними представлениями. У меня есть основная виртуальная машина, которая содержит экземпляры дочерних виртуальных машин. В какой-то момент основная виртуальная машина должна взаимодействовать с дочерним элементом.Родительский просмотрМодель общения ребенка

В главной ВМ. Я определил ребенка ViewModel как

public ChildViewModel VmChild 
    { 
     get 
     { 
      if (this.vmChild == null) 
       this.vmChild = new ChildViewModel(); 
      return this.vmChild; 
     } 
     set 
     { 
      if (this.vmChild != value) 
      { 
       this.vmChild = value; 
       this.OnPropertyChanged("VmChild"); 
      } 
     } 
    } 

В главном окне. У меня есть

<StackPanel Orientation="Vertical" HorizontalAlignment="Left" > 
    <localViews:ChildView DataContext="{Binding VmChild}"> </localViews:ChildView> 
</StackPanel> 

В коде зрения ребенка позади.

public ChildViewModel ViewModel 
{ 
    get 
    { 
     if (this.vmChild == null) 
      this.vmChild = new ChildViewModel(); 
     return this.vmChild; 
    } 
    set 
    { 
     if (this.vmChild != value) 
     { 
      this.vmChild = value; 
     } 
    } 
} 

И

private void InitializeViewModel() 
{ 
    if (this.DataContext is ChildViewModel) 
    { 
     this.ViewModel = this.DataContext as ChildViewModel; 
    } 
    else 
    { 
     this.DataContext = this.ViewModel; 
    } 
} 

Мой вопрос мой код работает. Однако он имеет исключение, когда я открываю основной вид.

Исключение составляет NullReferenceException was thrown on "ChildView": Cannot create an instance of "ChildView". Линия ошибки находится в this.vmChild = new ChildViewModel();

Я думаю, что я дважды задал экземпляр модели представления, чтобы вызвать ее. В основной модели просмотра я уже определил дочерний экземпляр vm. В коде позади детского представления я определил его снова. Но я не знаю, как это исправить.

EDIT: image

+0

Ошибка строки находится в 'this.vmChild = new ChildViewModel();' _, но у вас есть 2 из этих строк. Это очень странно. –

+0

Эта картина не помогает, если вы не сообщите нам, что находится в строке 82. Но похоже, что проблема может быть внутри этого конструктора. –

+0

Строка 82 кажется непочтительной. Это код части catch. Теперь возникает ошибка «Катастрофический сбой» (Исключение из HRESULT: 0x8000FFFF (E_UNEXPECTED)) ». Дело в том, что я использую ваш код. «DataContext» имеет значение null. Причина в том, что код достиг первого геттера. Ему не присвоено значение в ViewModel. – Bigeyes

ответ

0

Вы пытаетесь 'исправить' сценарий нулевого значения, которое не должно иметь место или следует оставить в покое.

Снимите обе части кода, за ребенка, и если вам действительно нужно свойство ViewModel (это это для UWP?), Используйте:

// not normally needed in WPF/MVVM 
public ChildViewModel ViewModel { get { return DataContext as ChildViewModel; } } 

Ребенок зрения является получение модель представления, он не должен его создавать.

+0

Это проект Silverlight. Мне еще нужна часть установки? Я использую .NET 4 в Visual Studio 2010. Кажется, нужен setter. – Bigeyes

+0

Нет, вы настраиваете DataContext. ViewModel не нуждается в настройщике. –

+0

Но поскольку я знаю, что C# 4.0 нуждается в getter и setter вместе, если не использовать C# 6.И ошибка все еще там. – Bigeyes

0

В главном окне заменить

DataContext="{Binding VmEChild} 

с

DataContext="{Binding VmChild} 
+0

Извините, это опечатка в вопросе. Я его понимаю. Это не настоящая причина. – Bigeyes

+1

Код вопроса не должен иметь опечаток. Всегда копировать/вставлять из фактического кода. –

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