Domanda

Questo è per quanto riguarda MVVM & WPF -showing tooltip dinamico in base alla posizione del mouse su un Treeviewitems WPF. Diciamo quando gli si libra utente passa sopra un nodo che ha ottenuto alcuni dati di business sulla base che dovrebbe visualizzare tooltip.

Esempio: diciamo Se mi passa il mouse sopra direttore items..should dico - "bloccato" e per gli altri "Pronto per modifica" .. ecc. Dipende il mouse sopra gli elementi data..tooltip testo dovrebbe guidare l'utente a fare ulteriori azioni. Sto cercando di fare un po 'l'impostazione VM testo tooltip con l'aiuto di caso di TreeViewItem apertura Tooltip e cercando di aggiornare il tooltip text..but rivolto qualche problema.

Quali sono tutto il modo migliore e più semplice per farlo. Provato il comportamento e finire con qualche errore.

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"

Codice:

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

    }

Nel mio modello vista mi aspetto per gestire il ToolTipOpeningCommand e dichiarato sufficiente per ottenere l'evento tramite classe di comportamento.

È interessante notare che il comportamento contextmenu funziona bene, ma il comportamento tooltip getta eccezione parser XAML ..

1) Am I definita al posto giusto (per comportamento)? 2) Se contextMenu opere di comportamento perché non tooltipbehavior? 3) Ogni indizio dall'eccezione incollato in alto?

mi aspetto di, (XAML) -tooltip comportamento -> per richiamare evento ToolTipOpening nel (classe comportamento) -> che a sua volta richiama il comando definito nel ViewModel. Ho provato questo modo analogo per il menu di contesto e funziona bene.

Pls fornire qualche suggerimento su come risolvere questo problema.

È stato utile?

Soluzione

L'errore XAML parser è perché si sta tentando di collegare un Behavior che si applica solo a ExtendedTreeViewItem ad un elemento ExtendedTreeView. In altre parole, se si cambia Behavior<ExtendedTreeViewItem> a Behavior<ExtendedTreeView>, si correggere l'errore di analisi.

Anche se non possiamo vedere dal codice che hai presentato, il motivo per il ContextMenu funziona è probabilmente perché deriva da un WorkspaceTreeViewContextMenuBehavior Behavior con un parametro di tipo generico che è compatibile con ExtendedTreeView, come ad esempio FrameworkElement.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top