WPF Treeview Tooltip - Dynamic
-
12-10-2019 - |
Вопрос
Это относится к динамической выявлению инструментов MVVM & WPF на основе расположения мыши на WPF TreeViewItems. Скажем, когда пользователь колеблется над узлом, в котором есть некоторые бизнес -данные, основанные на том, что он должен отображать подсказку.
Пример: давайте скажем, если я нахожусь на элементы менеджера ... должно сказать: «Заблокировано», а для других «готовы редактировать» ... и т. Д. Зависит от мыши с данными о элементах. Я пытаюсь сделать настройку виртуальной машины текста подъема инструментов с помощью события открытия подъема инструментов TreeViewItem и пытаться обновить текст подъема инструментов. Но столкнувшись с какой -то проблемой.
Что такое лучшее и простой способ сделать это. Пробовал поведение и в конечном итоге с некоторой ошибкой.
System.Windows.Markup.XamlParseException occurred
Message="Cannot add content of type 'x.x.Views.CustomTreeView.TreeTooltipBehavior' to an object of type 'System.Windows.Interactivity.BehaviorCollection'. Error at object 'x.x.x.Views.CustomTreeView.TreeTooltipBehavior' in markup file 'x.x.x.Views;component/mypage.xaml' Line 72 Position 53."
Source="PresentationFramework"
Код:
<MyMyControls:ExtendedTreeView x:Name="MyTreeView" ItemsSource="{Binding MyDriveCollection}"
ItemContainerStyle="{StaticResource TVStyleTemplate}">
<MyMyControls:ExtendedTreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type NavModel:TreeDataItem}" ItemsSource="{Binding MyDriveCollection}">
<MyControls:SimpleEditableTextBlock x:Name="TabLabel" Text="{Binding Path=MenuText, Mode=TwoWay}"
ToolTip="{Binding MenuText,Mode=TwoWay}">
</MyControls:SimpleEditableTextBlock>
</HierarchicalDataTemplate>
</MyControls:ExtendedTreeView.ItemTemplate>
<MyControls:ExtendedTreeView.ContextMenu>
<ContextMenu ItemsSource="{Binding ContextMenuItems}">
<ContextMenu.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding MenuText}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type TreeView}},Path=SelectedItem}" Command="{Binding Command}">
</MenuItem>
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</MyControls:ExtendedTreeView.ContextMenu>
<i:Interaction.Behaviors>
<CustomTreeView:TreeTooltipBehavior CustomTreeView:ToolTipOpeningCommand="{Binding ToolTipOpeningCommand,Mode=TwoWay,diag:PresentationTraceSources.TraceLevel=High}" />
<CustomTreeView:WorkspaceTreeViewContextMenuBehavior ContextMenuOpeningCommand="{Binding ContextMenuOpeningCommand}"/>
</i:Interaction.Behaviors>
</MyControls:ExtendedTreeView>
Treetooltipbehavior.cs
public class TreeTooltipBehavior : Behavior<ExtendedTreeViewItem>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.ToolTipOpening += new ToolTipEventHandler(AssociatedObject_ToolTipOpening);
}
void AssociatedObject_ToolTipOpening(object sender, ToolTipEventArgs e)
{
if (sender != null)
{
TreeDataItem hit = ((TreeDataItem) (((FrameworkElement) (sender)).DataContext));
if (ToolTipOpeningCommand != null)
{
ToolTipOpeningCommand.Execute(hit);
}
}
}
public static readonly DependencyProperty ToolTipOpeningCommandProperty = DependencyProperty.Register(
"ToolTipOpeningCommand",
typeof(ICommand),
typeof(TreeTooltipBehavior),
new PropertyMetadata(null));
public ICommand ToolTipOpeningCommand
{
get { return (ICommand)GetValue(ToolTipOpeningCommandProperty); }
set { SetValue(ToolTipOpeningCommandProperty, value); }
}
}
По модели, я ожидаю, что я буду справиться с ToolpopeningCommand и объявлен достаточно, чтобы получить событие через класс поведения.
Интересно, что поведение ContextMenu работает нормально, но поведение подпрыгивания инструментов бросает исключение синтаксического анализатора XAML ..
1) Я определен в нужном месте (для поведения)? 2) Если поведение ContextMenu работает, то почему бы не Tooltipbehavior? 3) Любая подсказка из исключения, вставленного наверху?
Я ожидаю, (xaml) -tooltip поведение -> вызовать событие Toolpopening в (класс поведения) ->, который в свою очередь вызывает команду, определенную в ViewModel. Я попробовал этот аналогичный путь для контекстного меню и работает нормально.
Пожалуйста, дают некоторый намек на решение этой проблемы.
Решение
Ошибка анализатора XAML - это потому, что вы пытаетесь прикрепить Behavior
это относится только к ExtendedTreeViewItem
чтобы ExtendedTreeView
элемент. Другими словами, если вы измените Behavior<ExtendedTreeViewItem>
к Behavior<ExtendedTreeView>
, вы исправите ошибку Parse.
Хотя мы не можем видеть из представленного вами кода, причина ContextMenu
работает, вероятно, потому что WorkspaceTreeViewContextMenuBehavior
происходит от Behavior
с общим параметром типа, который совместим с ExtendedTreeView
, такие как FrameworkElement
.