Я немного поиграл и нашел это решение.
Моя цель состояла в том, чтобы сделать возможным использование Binding
.
Если вы обнаружите какую-либо ошибку, дайте мне знать.
Iсоздал прикрепленное поведение и соответствующее прикрепленное свойство
public static class LastSelectedItemBehavior
{
public static readonly DependencyProperty ExposeLastSelectedItemProperty =
DependencyProperty.RegisterAttached("ExposeLastSelectedItem", typeof(bool), typeof(LastSelectedItemBehavior),
new PropertyMetadata(false, ExposeLastSelectedItemChanged));
public static bool GetExposeLastSelectedItem(ListBox element)
{
return (bool)element.GetValue(ExposeLastSelectedItemProperty);
}
public static void SetExposeLastSelectedItem(ListBox element, bool value)
{
element.SetValue(ExposeLastSelectedItemProperty, value);
}
private static void ExposeLastSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is ListBox listBox && e.NewValue is bool boolValue)
{
if (boolValue)
{
listBox.SelectionChanged += ListBox_SelectedItemsChanged;
}
else
{
listBox.SelectionChanged -= ListBox_SelectedItemsChanged;
}
}
}
private static void ListBox_SelectedItemsChanged(object sender, SelectionChangedEventArgs e)
{
var listBox = (ListBox) sender;
listBox.SetValue(LastSelectedItemPropertyKey, listBox.SelectedItems.Count > 0 ? listBox.SelectedItems[listBox.SelectedItems.Count - 1] : default(object));
}
private static readonly DependencyPropertyKey LastSelectedItemPropertyKey =
DependencyProperty.RegisterAttachedReadOnly(
"LastSelectedItem",
typeof(object),
typeof(LastSelectedItemBehavior),
new PropertyMetadata(default(object)));
public static readonly DependencyProperty LastSelectedItemProperty = LastSelectedItemPropertyKey.DependencyProperty;
public static object GetLastSelectedItem(ListBox element)
{
return element.GetValue(LastSelectedItemProperty);
}
}
На вашем ListView
вы должны установить ExposeLastSelectedItem
<ListView x:Name="listView" local:LastSelectedItemBehavior.ExposeLastSelectedItem="True" />
И тогда вы можете связать вот так
<ContentControl Content="{Binding ElementName=listView, Path=(local:LastSelectedItemBehavior.LastSelectedItem)}" />
Редактировать:
MVVM дружественное решение с использованием метода из Дмитрий Ташкинов
<ListView x:Name="listView" local:LastSelectedItemBehavior.ExposeLastSelectedItem="True">
<local:DataPiping.DataPipes>
<local:DataPipeCollection>
<local:DataPipe
Source="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListView}}, Path=(local:LastSelectedItemBehavior.LastSelectedItem)}"
Target="{Binding Path=LastSelectedItem, Mode=OneWayToSource}"/>
</local:DataPipeCollection>
</local:DataPiping.DataPipes>
</ListView>