这是关于MVVM& WPF - 根据WPF Treeviewitems上的鼠标位置显示动态工具提示。假设用户将鼠标悬停在一个节点上,该节点已经获得了一些业务数据,因为它应该显示工具提示。
示例:如果我将鼠标悬停在经理项目上,请说 - “已锁定”,其他人则为“准备编辑”等。取决于项目数据上的鼠标。工具文本应引导用户做进一步的操作。我正在尝试使用TreeViewitem的Tooltip打开事件并尝试更新工具提示文本来处理工具提示文本的某些VM设置。但是面临一些问题。
有什么最好,最简单的方法。尝试行为并最终出现一些错误。
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); }
}
}
在我的视图模型中,我期望处理ToolTipOpeningCommand并声明足以通过Behavior类获取事件。
有趣的是,contextmenu行为正常但工具提示行为会引发xaml解析器异常..
1)我是在正确的地方定义的(行为)? 2)如果Contextmenu行为有效,为什么不工具提示? 3)粘贴在顶部的异常的任何线索?
我期待着, (Xaml)-tooltip行为 - &gt;在(行为类)中调用tooltipopening事件 - &gt;它依次调用ViewModel中定义的命令。我尝试了类似于上下文菜单的方式并且工作正常。
请提供一些有关解决此问题的提示。
答案 0 :(得分:0)
XAML解析器错误是因为您尝试附加仅适用于Behavior
到ExtendedTreeViewItem
元素的ExtendedTreeView
。换句话说,如果您将Behavior<ExtendedTreeViewItem>
更改为Behavior<ExtendedTreeView>
,则会修复解析错误。
虽然我们无法从您提供的代码中看到,ContextMenu
的工作原因可能是因为WorkspaceTreeViewContextMenuBehavior
派生自Behavior
,其泛型类型参数与{{1}兼容},例如ExtendedTreeView
。