#wpf #listview #mvvm #nested
#wpf #listview #mvvm #вложенный
Вопрос:
у меня есть вложенный listview, я могу привязать выбранный элемент базового listview к моей viewmodel, но не выбранный элемент вложенного listview (в базовом listview) Я просто делаю: это мой listview:
<ListView Height="155" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible" dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="False" Margin="24,506,280,169" Background="#CDC5CBC5"
dd:DragDrop.DropHandler="{Binding}" SelectedItem ="{Binding Path=SelectedCluster,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" ItemsSource="{Binding Path=Clusters,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" >
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Titel" DisplayMemberBinding="{Binding Title}"/>
<GridViewColumn Header="Questions">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ListView DataContext="{Binding}" ItemsSource="{Binding ExaminationQuestions}" SelectedItem="{Binding Path=SelectedExaminationQuestionInCluster,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
<ListView.View>
<GridView>
<GridViewColumn Header="Description" DisplayMemberBinding="{Binding Question.Description}"/>
</GridView>
</ListView.View>
</ListView>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
Viewmodel:
public ExaminationQuestion SelectedExaminationQuestionInCluster
{
get { return selectedExaminationQuestionInCluster; }
set { selectedExaminationQuestionInCluster = value;
OnPropertyChanged("SelectedExaminationQuestionInCluster");
}
}
Кто-нибудь, кто знает, что я делаю не так? Если я установлю точку останова для параметра selecteditem второго listview. Он просто игнорирует это..
Спасибо
Ответ №1:
Я предполагаю, что привязка, вероятно, неверна. В вашем внешнем ListView вы привязываетесь к «Кластерам». Ваш внутренний ListView, вероятно, пытается привязаться к «SelectedExaminationQuestionInCluster» в текущем кластере. Вы можете проверить, так ли это, используя snoop. Это ценный инструмент при отладке приложений WPF. Он выделит красным цветом поврежденные привязки и сообщит вам, что с ними не так.
Если вы хотите привязаться к «SelectedExaminationQuestionInCluster» в родительском DataContext, вы могли бы использовать этот синтаксис:
SelectedItem="{Binding Path=DataContext.SelectedExaminationQuestionInCluster,
ElementName=OuterListView}"
Конечно, вам придется присвоить внешнему ListView имя.
РЕДАКТИРОВАТЬ: Я только что понял, что это может не иметь смысла. Если у каждого кластера есть своя коллекция ExaminationQuestions, то у каждого кластера также должен быть SelectedExaminationQuestion. Родительский DataContext не должен иметь никакого представления о SelectedQuestion, если только он не является общим для всех кластеров.