Обновление 3
Поскольку вы используете MvvmLight: в NoteView попробуйте изменить
DataContext="{Binding Note, Source={StaticResource Locator}}"
до
<UserControl.Style>
<Style TargetType="UserControl">
<Setter Property="DataContext" Value="{Binding Note, Source={StaticResource Locator}}"/>
</Style>
</UserControl.Style>
Обновление 2
Обнаружил похожую проблему несколько минут назад, которую я не совсем понял, поэтому я добавлю здесь то же решение, чтобы посмотреть, поможет ли это. Что произойдет, если вы измените это на это?
<v:NoteView DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type Popup}},
Path=DataContext.SelectedNote}"/>
Обновление
Я не могу воспроизвести это. Попробуйте добавить это в свой конструктор NoteView. Вы достигаете DataContextChangedHandler, когда вы меняете выбор в ListView?
public NoteView()
{
InitializeComponent();
DependencyPropertyDescriptor dpd =
DependencyPropertyDescriptor.FromProperty(UserControl.DataContextProperty,
typeof(UserControl));
if (dpd != null)
{
dpd.AddValueChanged(this, new EventHandler(DataContextChangedHandler));
}
}
void DataContextChangedHandler(object sender, EventArgs e)
{
MessageBox.Show("DataContext Changed: " + DataContext);
}
Первый ответ
Ваша DockPanel получит NoteViewModel как DataContext, а не ListView, так как этот DataContext наследуется всеми дочерними объектами, каждый дочерний элемент получит NoteViewModel как DataContext. Чтобы использовать ListView в качестве DataContext для Popup, вы можете сделать это. Я не уверен, что делает привязка DataContext для StackPanel, поэтому я мог бы что-то здесь упустить ..
<DataTemplate DataType="{x:Type vm:NoteViewModel}">
<DockPanel>
<TextBlock Text="{Binding Title}" />
<Popup Placement="Right"
PlacementTarget="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}"
IsOpen="{Binding (ListViewItem.IsSelected), RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}"
DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}">
<StackPanel>
<TextBlock Text="{Binding SelectedNote.Title}" />
<StackPanel>
<v:NoteView DataContext="{Binding SelectedNote}"/>
</StackPanel>
</StackPanel>
</Popup>
</DockPanel>
</DataTemplate>