当前位置: 首页 > 知识库问答 >
问题:

选择的树视图为空

岳城
2023-03-14

我想为我的树视图创建一个上下文菜单。TreeView 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中使用它。

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

  • T_Frage
    • T_Wertung
    • T_Wertung
    • T_Wertung

    我想为标题创建一个上下文菜单。因此,如果用户单击T_Frage类型的TreeView项,就会弹出一个ContextMenu。我遵循了这个指南http://canhandre.wordpress.com/2012/01/14/wpf-treeview-with-contextmenu/我现在在CodeBehind中做这件事只是为了测试它。问题是,当执行此代码时:TreeViewItem selectedItem=treeView1。选择EdItem作为TreeViewItem 树视图1。SelectedItem的类型为T_Frage,并且有它的值,但是当我分配给SelectedItem时,SelectedItem仍然为null。。。为什么?

    编辑:删除ItemsSource并在XAML中创建正常的TreeViewItem

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

    将在此处分配值treevieItem selectedItem=treeView1。选择EdItem作为TreeViewItem 。这意味着我不能将TreeView中类型为t_Frage的项分配给TreeView类型的变量。我应该如何为我的TreeView中不是TreeView类型的项创建上下文菜单?如上面所示,将T_Frage的类型分配给TreeViewItem将导致null。


共有1个答案

郦兴德
2023-03-14

我知道现在是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\u Frage类型。如果为true,我将创建一个类型为T_Frage的新变量,并将其上下文设置为SelectedItem的值。现在,我可以对该项执行一些操作,然后将一项添加到名为OCContext的ContextMenu列表中。当我右键单击该项目时,将弹出ContextMenu,其中显示OCContext的项目。

 类似资料:
  • 问题内容: 我试图以与从中选择类似的方式选择的列名称。 我似乎找不到解决办法。有没有其他人以前做过此事,或者知道是否有可能? 问题答案: information_schema.columns.Table_name(至少在Sql Server 2000下)包含视图,因此只需使用

  • 我有一个绑定到MVVM可观察集合的TreeView。我的项目模板由图像和文本块组成,如以下代码所示: 当然,发生这种情况是因为堆栈面板现在位于选择区域上方。 有什么解决办法吗?

  • 我工作在一个WPF应用程序,我有2树视图。两者都有一个ViewModel对象集合作为其ItemsSource。我试图使它,当用户选择一个TreeView中的项目时,其他的选择被更改为空。 但是,我注意到TreeView中的实际项目属于SomethingViewModel类型,而不是TreeView项目。这意味着他们没有选择的财产。我已经尝试将IsSelected属性添加到ViewModel对象,并

  • 树视图以分层视图显示文档。导航栏可让你快速地切换、插入或删除文档。 添加一个文档 在导航栏点击 或按 CTRL+N 来得到一个空白显示的文档。 输入所需的数据。 在导航栏点击 来保存文档。 【注意】如果你的集合是空的,你需要点击 来添加新字段。 编辑一个文档 前往你想编辑的文档。 点击要修改的字段名、值或类型。 在导航栏点击 来应用更改。 添加一个字段或一个项目 前往你想编辑的文档。 点击 来添加

  • 树视图以分层视图显示文档。导航栏可让你快速地切换、插入或删除文档。 添加一个文档 在导航栏点击 或按 COMMAND-+ 来得到一个空白显示的文档。 输入所需的数据。 在导航栏点击 来保存文档。 【注意】如果你的集合是空的,你需要点击 来添加新字段。 编辑一个文档 前往你想编辑的文档。 点击要修改的字段名、值或类型。 在导航栏点击 来应用更改。 添加一个字段或一个项目 前往你想编辑的文档。 点击

  • 树视图以分层视图显示文档。导航栏可让你快速地切换、插入或删除文档。 添加一个文档 在导航栏点击 或按 CTRL+N 来得到一个空白显示的文档。 输入所需的数据。 在导航栏点击 来保存文档。 【注意】如果你的集合是空的,你需要点击 来添加新字段。 编辑一个文档 前往你想编辑的文档。 点击要修改的字段名、值或类型。 在导航栏点击 来应用更改。 添加一个字段或一个项目 前往你想编辑的文档。 点击 来添加