У меня есть свойство Attached, которое называется TreeViewSelectedItem. Не вдаваясь в слишком подробные сведения о том, зачем мне это приложенное свойство, я скажу, что это связано с необходимостью обновления различных свойств на моей виртуальной машине на основе того, какой тип элемента выбран в TreeView.Установка значения свойства из встроенного свойства
Моя проблема: я не могу заставить мой код обновлять свойство на виртуальной машине.
Установка XAML:
<TreeView ItemsSource="{Binding Lists}" l:BindableSelectedItemBehavior.TreeViewSelectedItem="{Binding SelectedListGroup}">
<ItemsControl.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding }" >
<TextBlock Text="{Binding Key}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</ItemsControl.ItemTemplate>
</TreeView>
Мой Attached Property:
public static object GetTreeViewSelectedItem(DependencyObject obj)
{
return (object)obj.GetValue(TreeViewSelectedItemProperty);
}
public static void SetTreeViewSelectedItem(DependencyObject obj, object value)
{
obj.SetValue(TreeViewSelectedItemProperty, value);
}
// Using a DependencyProperty as the backing store for TreeViewSelectedItem. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TreeViewSelectedItemProperty =
DependencyProperty.RegisterAttached("TreeViewSelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null,
(s,a) =>
{
TreeView tree = s as TreeView;
if (tree == null)
return;
if (a.NewValue != null)
{
tree.SelectedItemChanged += tree_SelectedItemChanged;
tree.SourceUpdated += tree_SourceUpdated;
}
else
{
}
}));
static void tree_SourceUpdated(object sender, System.Windows.Data.DataTransferEventArgs e)
{
throw new NotImplementedException();
}
static void tree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeView tree = sender as TreeView;
object binding;
BindingExpression bindingExp;
if (tree == null)
return;
bindingExp = BindingOperations.GetBindingExpression(tree, BindableSelectedItemBehavior.TreeViewSelectedItemProperty);
binding = GetTreeViewSelectedItem(tree);
if (binding == null)
return;
if (binding.GetType() == e.NewValue.GetType())
{
System.Diagnostics.Debug.WriteLine("Type match");
binding = tree.SelectedItem;
//tree.SetValue(BindableSelectedItemBehavior.TreeViewSelectedItemProperty, tree.SelectedItem);
//SetTreeViewSelectedItem(tree, tree.SelectedItem);
tree.SetCurrentValue(BindableSelectedItemBehavior.TreeViewSelectedItemProperty, tree.SelectedItem);
}
}
На дне, я попробовал много разных способов, чтобы попытаться обновление бы это вложенное свойство привязывается к а он, похоже, не попадает в метод Set свойства VM (не попадает в точку останова).
Как обновить это свойство?
Просто дружественный комментарий: Если вы подписаны на мероприятие, не забудьте отказаться от использования. Вам вопрос. Вероятно, проще создать класс, полученный из Treeview, и переопределить 'SelectedItem'- Свойство – lokusking
@lokusking, хорошо поймать отмену подписки. Это всего лишь тестовый код, поэтому я не беспокоился об этом, но для тех, кто смотрит на это, это действительно важно НЕ Оставить! И вы правы, на данный момент может быть проще подклассифицировать TreeView. –
Самое смешное, что Treeview как это свойство, но только для чтения. [Это] (http://stackoverflow.com/questions/1000040/data-binding-to-selecteditem-in-a-wpf-treeview) может помочь вам в дальнейших действиях – lokusking