Связывание View и ViewModel в DataGrid
Я использую View и ViewModel, установленные на уже существующей ViewModel. Можно сказать, что это основа со второй ViewModel, размещенной на нем.
При размещении другой ViewModel в базовой ViewModel из MainViewModel
(BrowseViewModel
в данном конкретном примере) связанная ViewModel не отображается.
Реализация следующим образом:
class MainViewModel : PropertyChangedBase
{
private BrowseViewModel _BrowseViewModel= new BrowseViewModel();
public BrowseViewModel BrowseViewModel
{
get { return _BrowseViewModel; }
set
{
if (_BrowseViewModel== value) return;
_BrowseViewModel= value;
NotifyOfPropertyChange("BrowseViewModel");
}
}
}
class BrowseViewModel: PropertyChangedBase
{
private ListingViewModel _ListingViewModel = new ListingViewModel();
public ListingViewModel ListingViewModel
{
get { return ListingViewModel; }
set
{
if (_ListingViewModel == value) return;
_ListingViewModel = value;
NotifyOfPropertyChange("ListingViewModel");
}
}
}
ListingViewModel...
(Я вырезал неуместный код здесь)
Реализация в моей разметке (MainView):
<ContentControl x:Name="BrowseViewModel"/>
И в BrowseView
:
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<ContentControl x:Name="ListingViewModel"/>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
Я столкнулся с той же самой проблемой сегодня, когда добавлял другую ViewModel в существующую базовую ViewModel MainViewModel
, Если у меня нет базовой ViewModel и если я использую текущий MainViewModel
все работает правильно.
Примечание: я сказал Caliburn искать Views и их ViewModel в ранее названных пространствах имен, это не проблема.
2 ответа
Похоже, что вы связываете что-то с DataGrid в BrowseView правильно?
Объявить что-то вроде
<ContentControl x:Name="ListingViewModel"/>
это сокращенная версия объявления
<ContentControl cal:View.Model="{Binding ListingViewModel" />
Поэтому я предполагаю (давно я работал в WPF), что DataContext в RowDetailsTemplate - это не BrowseViewModel, а то, что вы привязываете к DataGrid.
Попробуй это...
<ContentControl cal:View.Context="BrowseView" cal:View.Model="BrowseViewModel" />
это должно получить ваш BrowseView и связать соответственно, так как MainViewModel содержит реквизит BrowseViewModel, он должен связываться правильно. Это предполагает <ProjectName>.Views.BrowseView
пространство имен и <ProjectName>.ViewModels.BrowseViewModel
Точно так же с ListingViewModel