#.net #wpf #binding #treeview #mvvm-light
#.net #wpf #привязка #просмотр дерева #mvvm-light
Вопрос:
Я использую MVVM-Light. В моем XAML у меня есть следующая привязка в TreeView.
<TreeView Grid.Row="1"
ItemsSource="{Binding Model.Root.ChildPages, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
Свойство модели в виртуальной машине выглядит следующим образом.
public TreeModel Model
{
get { return model_; }
set
{
Set(nameof(Model), ref model_, value);
}
}
Древовидная модель и TreeModel.Root — это оба наблюдаемых объекта.
TreeModel.Root.Дочерние страницы — это наблюдаемая коллекция.
(На самом деле я не изменяю текущие привязанные объекты, но я установил совершенно новую модель, чтобы я фактически использовал наблюдаемые объекты, поскольку моя модель не должна иметь никакого значения, но я подумал, что это стоит упомянуть)
При настройке моего свойства модели мой TreeView не обновляется / не показывает новую TreeModel. Насколько мне известно, функция Set() из MVVM Light должна вызывать RaisePropertyChanged() внутренне.
ViewModel, к которому привязывается представление, является производным от класса MyViewModelBase, который является производным от класса ViewModelBase MVVM Light. Свойство модели определено в классе MyViewModelBase.
Чего мне не хватает, почему представление не обновляется? Как это решить?
При настройке свойства модели из конструктора ViewModels оно будет отображаться так, как ожидается в TreeView, только последовательные вызовы свойства модели извне элемента управления не влияют на TreeView. Я отладил и подтвердил строку в установщике
Set(nameof(Model), ref model_, value);
действительно вызывается.
Комментарии:
1. В качестве дополнительного примечания вы могли бы также использовать перегрузку, которая опускает имя свойства:
Set(ref model_, value);
. Что касается вашей реальной проблемы, вам необходимо предоставить более подробную информацию о том, как вы устанавливаетеDataContext
и т.д.2. Хороший момент, спасибо. Я создаю пользовательский элемент управления. В нем у меня есть ContentControl, который привязан к свойству «Mode» на виртуальной машине UserControls. Для этого свойства «Mode» будет установлено значение «ViewModel», обсуждаемое в вопросе. Я использую DataTemplate для установки представления, которое должно быть связано с ViewModel. У меня есть свойство на уровне пользовательского контроля. В своем установщике я публикую новую модель с помощью MVVM-Light Messenger. ViewModel, обсуждаемый в вопросе, получает сообщение и устанавливает новое значение в свое собственное свойство модели. Это свойство является кодом, который у меня есть в вопросе.
3. DataContext View извлекается с помощью ViewModelLocator. Я использую тот же ViewModelLocator для установки свойства «Mode». Таким образом, это единственный экземпляр, используемый в качестве DataContext для представления, а также используемый для DataTemplate в ContentControl «внешнего» пользовательского элемента управления.
4. Я должен иметь возможность ожидать обновления TreeView, когда для ItemSource установлено значение Model.Root. Дочерние страницы, и я обновляю модель? Таким образом, это не связано с тем, что я привязываюсь к «вложенному свойству», нужно ли мне каким-то образом снова устанавливать ItemSource? Если да, то как это можно сделать с виртуальной машины? @mm8 Просто добавляю свой здесь, чтобы вы заметили мои ответы.
5. Вы должны увидеть обновление при условии, что вы установили
Model
свойство для нового объекта. Убедитесь, что вы изменяете экземпляр модели представления с привязкой к данным.
Ответ №1:
Найдено решение проблемы. Пользовательские ресурсы не объединяются таким же образом при ссылке на usercontrols второго уровня, как на уровне app.xaml. Поскольку мое представление было настроено на получение datacontext из vmlocator, а контейнер IoC был локальным для vmlocator (обязательно, если вы хотите иметь возможность создавать несколько пользовательских контроллеров), представления второго уровня получили новые экземпляры VMLocator, а не родительский экземпляр. Следовательно, новый экземпляр также ввел новую пустую модель, которая объяснила странное поведение.