0

我想为我的 TreeView 创建一个 ContextMenu。树视图 XAML:

<helper:ExtendedTreeView Grid.Row="5" ItemsSource="{Binding OCFrage, Mode=TwoWay}" SelectedItem_="{Binding SelectedItem, Mode=TwoWay}" SelectedItemChanged="treeView1_SelectedItemChanged" x:Name="treeView1" Height="205" Width="215">
    <helper:ExtendedTreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type model:T_Frage}" ItemsSource="{Binding Wertung, Mode=TwoWay}">
            <TextBlock Text="{Binding Text}"/>
        </HierarchicalDataTemplate>
    </helper:ExtendedTreeView.Resources>
</helper:ExtendedTreeView>

而 helper:ExtendedTreeView 是这个类:

public class ExtendedTreeView : TreeView
{
    public ExtendedTreeView()
        : base()
    {
        this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(self);
    }

    void self(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (SelectedItem != null)
        {
            SetValue(SelectedItem_Property, SelectedItem);
        }
    }

    public object SelectedItem_
    {
        get { return (object)GetValue(SelectedItem_Property); }
        set { SetValue(SelectedItem_Property, value); }
    }
    public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null));
}

我使用它来绑定 SelectedItem 并在我的 ViewModel 中使用它。

我的 TreeView 有 T_Frage 类型的“标题”,它们的节点是 T_Wertung 类型,所以它是

  • T_Frage
    • T_Wertung
    • T_Wertung
  • T_Frage
    • T_Wertung ...

我想为标题创建一个 ContextMenu。因此,如果用户单击 T_Frage 类型的 TreeViewItem,则会弹出一个 ContextMenu。我已经按照本指南http://canhandre.wordpress.com/2012/01/14/wpf-treeview-with-contextmenu/进行操作,我目前正在 CodeBehind 中进行测试,只是为了对其进行测试。问题是,当这段代码被执行时:TreeViewItem selectedItem = treeView1.SelectedItem as TreeViewItem;treeView1.SelectedItem 的类型是 T_Frage 并且有它的值,但是当我分配给 selectedItem 时,selectedItem 仍然为空......为什么?

编辑:删除 ItemsSource 并在 XAML 中创建普通 TreeViewItems

  <TreeViewItem Header="Edit" Name="Edit">
       <TreeViewItem Header="Text"/>
       <TreeViewItem Header="Image"/>
       <TreeViewItem Header="Table"/>
  </TreeViewItem>

将在此处分配值TreeViewItem selectedItem = treeView1.SelectedItem as TreeViewItem;。这意味着我无法将 TreeView 中的 T_Frage 类型的项目分配给 TreeViewItem 类型的变量。我应该如何为我的 TreeView 中不是 TreeViewItem 类型的项目创建 ContextMenu?正如您在上面看到的,将 T_Frage 的类型分配给 TreeViewItem 将导致 null。

4

1 回答 1

0

我知道它现在是 MVVM 而不是 CodeBehind,但我只想先在 CodeBehind 中对其进行测试,然后在 MVVM 中进行所有操作,因为我认为立即在 MVVM 中进行操作会更难……无论如何,这就是我想要的:

<helper:ExtendedTreeView Grid.Row="5" ItemsSource="{Binding OCFrage, Mode=TwoWay}" SelectedItem_="{Binding SelectedItem, Mode=TwoWay}" SelectedItemChanged="treeView1_SelectedItemChanged" x:Name="treeView1" Height="205" Width="215">
    <TreeView.ContextMenu>
        <ContextMenu ItemsSource="{Binding OCContext}"/>
    </TreeView.ContextMenu)
    <helper:ExtendedTreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type model:T_Frage}" ItemsSource="{Binding Wertung, Mode=TwoWay}">
            <TextBlock Text="{Binding Text}"/>
        </HierarchicalDataTemplate>
    </helper:ExtendedTreeView.Resources>
</helper:ExtendedTreeView>

视图模型:

private object _selecteditem;
public object SelectedItem
{
    get { return _selecteditem; }
    set
    {
        OCContext = new ObservableCollection<T_Wertung>();
        if (value is T_Frage)
        {
            T_Frage selected = (T_Frage)value;
    //do something with selected
    OCContext.Add(new T_Wertung(1,"Test",100));
            }
        }
        RaisePropertyChanged(() => SelectedItem);
    }
}

private ObservableCollection<T_Wertung> _occontext;
public ObservableCollection<T_Wertung> OCContext
{
    get
    {
        if (_occontext == null)
            _occontext = new ObservableCollection<T_Wertung>();
        return _occontext;
    }
    set
    {
        _occontext = value;
        RaisePropertyChanged(() => OCContext);
    }
}

由于我绑定到 TreeView 的 SelectedItem,我可以询问 SelectedItem 是否属于 T_Frage 类型。如果是真的,我将创建一个 T_Frage 类型的新变量并将其上下文设置为 SelectedItem 的值。现在我可以对这个项目做一些事情,然后将一个项目添加到名为 的 ContextMenu 的列表中OCContext。当我右键单击该项目时,会弹出 ContextMenu 并显示OCContext.

于 2013-07-11T09:55:14.807 回答