Frage

Dies ist Bezug auf MVVM & WPF -showing dynamischen Tooltip basierend auf Mausposition auf einem WPF Treeviewitems. Lassen Sie sagen, wenn der Benutzer schwebt über einem Knoten, der einige Geschäftsdaten auf der Basis bekommen hat, dass sie angezeigt werden Tooltip sollte.

Beispiel: Lassen Sie sagen, wenn ich schweben über Manager sagen items..should - "gesperrt" und für andere "Ready to edit" .. etc. Abhängig von der Maus über die Elemente data..tooltip Text der Benutzer weitere Maßnahmen zu tun, führen sollte. Ich versuche, einige VM Einstellung von Tooltiptext mit Hilfe der Tooltip Eröffnung von TreeViewItem zu tun und zu versuchen, den Tooltip zu aktualisieren text..but einige Problemen gegenüber.

Was ist die beste und einfache Art und Weise, es zu tun. Versuchte Verhalten und endet mit einem gewissen Fehler auf.

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"

Code:

<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); }
        }

    }

Aus meiner Sicht Modell erwarte ich den ToolTipOpeningCommand zu handhaben und erklärte genug, um das Ereignis über Behavior Klasse zu erhalten.

Interessanterweise ist das contextmenu Verhalten funktioniert gut, aber Tooltip Verhalten wirft XAML-Parser Ausnahme ..

1) Bin ich an der richtigen Stelle (für das Verhalten definiert ist)? 2) Wenn contextMenu Verhalten funktioniert, warum dann nicht tooltipbehavior? 3) Jeder Hinweis von der Ausnahme an der Spitze eingefügt?

Ich erwarte auf, (XAML) -tooltip Verhalten -> ToolTipOpening Ereignis in der (Verhaltensklasse) aufrufen -> was wiederum rufen Sie den Befehl im Ansichtsmodell definiert. Ich habe versucht, diese ähnliche Art und Weise für Kontextmenü und funktioniert gut.

bietet Pls einen Hinweis über dieses Problem zu beheben.

War es hilfreich?

Lösung

Der XAML-Parser-Fehler ist, weil Sie einen Behavior zu befestigen versuchen, die ExtendedTreeViewItem gilt nur für ein ExtendedTreeView Element. Mit anderen Worten, wenn Sie Behavior<ExtendedTreeViewItem> zu Behavior<ExtendedTreeView> ändern, werden Sie den Parse-Fehler beheben.

Auch wenn wir nicht aus dem Code sehen Sie, so ist der Grund, warum der ContextMenu funktioniert, ist wahrscheinlich, weil WorkspaceTreeViewContextMenuBehavior stammt von einem Behavior mit einem generischen Typparameter, die mit ExtendedTreeView, wie FrameworkElement kompatibel ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top