Question

est quant à l'infobulle dynamique MVVM & WPF basé sur l'emplacement de la souris sur un Treeviewitems WPF. Disons que lorsque l'utilisateur passe la souris dessus sur un nœud qui a obtenu des données commerciales basées sur ce qu'il doit afficher l'info-bulle.

Exemple: Si je dois vous dire en vol stationnaire au-dessus de gestionnaire items..should dire - « verrouillé » et pour les autres « Prêt à modifier » .. etc. Cela dépend de la souris sur les éléments data..tooltip texte doit guider l'utilisateur à faire d'autres mesures. Je suis en train de faire quelques réglages VM du texte de l'infobulle avec l'aide de l'événement d'ouverture de infobulle TreeViewItem et en essayant de mettre à jour l'info-bulle text..but face à une question.

Quels sont le meilleur moyen simple et de le faire. comportement Essayé et finissent avec une erreur.

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

    }

Dans mon modèle de vue, je me attends à gérer la ToolTipOpeningCommand et a déclaré assez pour l'événement par classe de comportement.

Fait intéressant le comportement contextmenu fonctionne très bien mais le comportement de infobulle lance exception de l'analyseur XAML ..

1) Je suis défini au bon endroit (comportement)? 2) Si les travaux de comportement contextMenu alors pourquoi ne pas tooltipbehavior? 3) Toute idée de l'exception collée au sommet?

Je me attends à,  (Xaml) -tooltip comportement -> pour appeler événement ToolTipOpening dans le (classe de comportement) -> qui à son tour appeler la commande définie dans le ViewModel. J'ai essayé cette façon similaire pour le menu contextuel et fonctionne très bien.

Pls fournir une indication sur la fixation de cette question.

Était-ce utile?

La solution

L'erreur de l'analyseur XAML est parce que vous essayez de joindre un Behavior qui s'applique uniquement ExtendedTreeViewItem à un élément de ExtendedTreeView. En d'autres termes, si vous changez Behavior<ExtendedTreeViewItem> à Behavior<ExtendedTreeView>, vous corriger l'erreur d'analyse syntaxique.

Bien que nous ne pouvons voir dans le code que vous avez présenté, la raison pour laquelle le fonctionnement ContextMenu est probablement parce que dérive de WorkspaceTreeViewContextMenuBehavior d'un Behavior avec un paramètre de type générique qui est compatible avec ExtendedTreeView, comme FrameworkElement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top