2017-02-19 11 views
-1

У меня есть приложение wpf, и я использую инструментарий mvvm light для моей привязки данных. У родительского представления есть datagrid родителей, а дочерний элемент управления имеет дочернюю сетку для дочерних элементов выбранного родителя, которые обращаются к одной и той же модели представления. Родитель и дети хорошо синхронизируются в модели представления, поэтому я не включаю код. Проблема заключается в следующем: Когда дочерний элемент управления связан следующим образом:MVVM свет как создается модель представления

<UserControl.Resources> 
    <CollectionViewSource x:Key="jobRequirementViewSource" 
          d:DesignSource="{d:DesignInstance {x:Type Models:JobRequirement}, CreateList=True}"/> 
    <DataTemplate DataType="{x:Type viewModel:jobViewModel}"> 
     <views:jrView/> 
    </DataTemplate> 

Все работает, как ожидалось, и ребенок сетки синхронизируется с родительским видом, с помощью кода в модели представления. При связывании в детской сетки является следующим:

<UserControl.DataContext> 
    <Binding Path="jobViewModel" Source="{StaticResource Locator}"/> 
</UserControl.DataContext> 

Тогда, по-видимому новый экземпляр модели представления создается и ребенок сетка не синхронизирован с экземпляром модели представления родительского GRID в. Я использую локатор модели представления, и экземпляр создается в локаторе. Модель представления инициируется в конструкторе локаторов со следующей строкой: SimpleIoc.Default.Register(); и включает конструктор модели представления в соответствии с примерами в mvvm light public jobViewModel jobViewModel {get {return ServiceLocator.Current.GetInstance(); } } Почему второй экземпляр модели представления, созданный, когда контекст данных дочернего элемента управления задан с помощью привязки UserControl.DataContext?

ответ

1

Почему второй экземпляр модели представления, созданный, когда контекст данных дочернего элемента управления задан с использованием привязки UserControl.DataContext?

Поскольку ViewModelLocator создает новый экземпляр модели представления при первом обращении к ServiceLocator.Current.GetInstance<jobViewModel>().

Каждого объекта разрешается ViewModelLocator в MvvmLight одноэлементен по умолчанию, так что вы должны убедиться, что вы используете ViewModelLocator создать всех экземпляров jobViewModel класса в вашем приложении, то есть сделать это:

var x = new ViewModel.ViewModelLocator(); 
var vm = x.jobViewModel; 

... вместо этого:

var vm = new jobViewModel(); 

... когда экземпляр jobViewModel в родительском вид модели O r, где вы его создаете.

Если вам нужна дополнительная помощь, вы должны предоставить репо Ваш вопрос: https://stackoverflow.com/help/mcve

+0

Спасибо за ответ. Мне потребовалось некоторое время, но я нашел ошибку в своем коде, как вы сказали выше. Родительское представление было привязано к viewmodel, созданному кодом, который обходил локатор viewmodel (как вы показали). Поэтому, когда я привязывал xaml дочернего представления к локатору, он использовал другой экземпляр viewmodel (созданный локатором), но привязка дочернего представления через datacontext привязывала его к экземпляру модели представления, используемой родительским Посмотреть. –

+0

Я предполагаю, что ваша проблема была решена тогда. Не забудьте принять ответ: http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – mm8