Pregunta

Esto es lo que se refiere a información de herramienta dinámica y MVVM WPF -showing basado en la ubicación del ratón en un WPF Treeviewitems. Digamos que cuando los elementos emergentes de los usuarios más de un nodo que tiene algunos datos de negocio basado en que debería mostrar información sobre herramientas.

Ejemplo: Digamos Si se ciernen sobre el gestor de items..should digo - "bloqueado" y para otros "Listo para editar" .. etc. Depende del ratón sobre artículos data..tooltip texto debe guiar al usuario a hacer más acciones. Estoy tratando de hacer un cierto ajuste VM de texto de sugerencia con la ayuda de evento de apertura Información sobre la herramienta de TreeViewItem y tratando de actualizar la información sobre herramientas text..but enfrenta algún problema.

¿Qué son todos los mejores y más sencilla manera de hacerlo. comportamiento tratado y terminar con algún error.

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"

Código:

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

    }

En mi modelo de vista estoy esperando para manejar la ToolTipOpeningCommand y declarada suficiente para obtener el evento a través de la clase de comportamiento.

Es interesante que el comportamiento contextual funciona bien, pero el comportamiento sobre herramientas lanza excepción analizador XAML ..

1) ¿Estoy define en el lugar correcto (para el comportamiento)? 2) Si las obras de comportamiento contextual entonces por qué no tooltipbehavior? 3) ¿Alguna pista de la excepción pegado en la parte superior?

Estoy esperando, (XAML) -tooltip comportamiento -> para invocar evento en el ToolTipOpening (clase de comportamiento) -> que a su vez invoca el comando definido en el modelo de vista. He intentado esto de forma similar para el menú de contexto y funciona bien.

pls proporciona algún indicio sobre la fijación de este problema.

¿Fue útil?

Solución

El error XAML analizador se debe a que está intentando adjuntar una Behavior que sólo se aplica a ExtendedTreeViewItem a un elemento ExtendedTreeView. En otras palabras, si cambia a Behavior<ExtendedTreeViewItem> Behavior<ExtendedTreeView>, se le solucionar el error de análisis.

A pesar de que no podemos ver desde el código que presenta, la razón por la que funciona el ContextMenu es probablemente porque deriva de un WorkspaceTreeViewContextMenuBehavior Behavior con un parámetro de tipo genérico que sea compatible con ExtendedTreeView, como FrameworkElement.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top