WPF Treeview Tooltip - динамический - PullRequest
0 голосов
/ 18 января 2011

Это относится к MVVM и WPF, показывающим динамическую подсказку, основанную на расположении мыши на элементах дерева WPF.Допустим, когда пользователь наводит указатель мыши на узел, который получил некоторые бизнес-данные, основанные на том, что он должен отображать всплывающую подсказку.

Пример: пусть скажем, если я наведу курсор мыши на элементы менеджера .. должен сказать - "заблокирован" и для других "Готов редактировать" ... и т. Д.Зависит от мыши над элементами данных. Текст подсказки должен направлять пользователя к дальнейшим действиям.Я пытаюсь выполнить некоторые настройки виртуальной машины для текста всплывающей подсказки с помощью события открытия всплывающей подсказки TreeViewitem и пытаюсь обновить текст всплывающей подсказки ... но сталкиваюсь с некоторой проблемой.

Каковы все лучшие и простые способысделай это.Попробовал поведение и в итоге получил какую-то ошибку.

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 поведение ->, чтобы вызвать событие всплывающей подсказки в (класс поведения) -> которое, в свою очередь, вызывает командуопределяется в ViewModel.Я попробовал этот аналогичный способ для контекстного меню и работает нормально.

Просьба дать подсказку об исправлении этой проблемы.

1 Ответ

0 голосов
/ 19 января 2011

Ошибка синтаксического анализатора XAML заключается в том, что вы пытаетесь присоединить Behavior, который применяется только к ExtendedTreeViewItem, к элементу ExtendedTreeView. Другими словами, если вы измените Behavior<ExtendedTreeViewItem> на Behavior<ExtendedTreeView>, вы исправите ошибку разбора.

Хотя мы не можем видеть из представленного вами кода, причина того, что ContextMenu работает, вероятно, заключается в том, что WorkspaceTreeViewContextMenuBehavior происходит от Behavior с параметром универсального типа, который совместим с ExtendedTreeView, таким как FrameworkElement ,

...