Часть вашего решения в этом ответе здесь .Это ответ только для ссылки с мертвой ссылкой (или был - я только что улучшил его), но он упоминает ключевой момент.
Вы не можете связать TreeView.SelectedItem
.Ваше определение свойства зависимости нарушается несколькими способами, и оно должно называться SelectedItem
в соответствии со стандартной практикой WPF.Ниже приведен код usercontrol, который определяет свойство зависимости вместе с обработчиками событий в качестве замены привязки.
public partial class CustomTreeView : UserControl
{
public CustomTreeView()
{
InitializeComponent();
}
#region SelectedItem Property
public Node SelectedItem
{
get { return (Node)GetValue(SelectedProperty); }
set { SetValue(SelectedProperty, value); }
}
public static readonly DependencyProperty SelectedProperty =
DependencyProperty.Register(nameof(SelectedItem), typeof(Node), typeof(CustomTreeView),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
Selected_PropertyChanged)
{ DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
protected static void Selected_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as CustomTreeView).OnSelectedChanged(e.OldValue);
}
private void OnSelectedChanged(object oldValue)
{
if (SelectedItem != treeView.SelectedItem)
{
var tvi = treeView.ItemContainerGenerator.ContainerFromItem(SelectedItem) as TreeViewItem;
if (tvi != null)
{
tvi.IsSelected = true;
}
}
}
#endregion SelectedItem Property
private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (SelectedItem != e.NewValue)
{
SelectedItem = e.NewValue as Node;
}
}
}
А вот TreeView в XAML UserControl.Я опускаю ItemsSource и ItemTemplate как не относящиеся к делу.
<TreeView
x:Name="treeView"
SelectedItemChanged="treeView_SelectedItemChanged"
/>
А вот фрагмент из MainWindow.xaml, который я использовал для его проверки:
<StackPanel>
<local:CustomTreeView x:Name="treeControl" />
<Label
Content="{Binding SelectedItem.Text, ElementName=treeControl}"
/>
</StackPanel>
Мой класс Node
имеет свойство Text
, и я заполняю деревочерез DataContext, чтобы избавить от необходимости устанавливать другое свойство зависимости для элементов.