从Linq2Sql绑定TreeView中删除子项

时间:2013-09-05 13:00:06

标签: c# wpf linq-to-sql mvvm treeview

我在WPF中有一个TreeView控件,它在第一级显示任务列表。每个任务都有一个人员列表。任务和人员都存储在数据库中。我编写了2个viewmodel类,它们封装了Linq2Sql类。 TreeView由2个分层DataTemplates组成,它引用了viewmodel类。显示数据效果很好,我可以毫无问题地添加任务和人员。

但是现在我遇到的问题是我要从上下文菜单中删除某个任务下面的人。我的问题是我无法访问父任务,因此无法更新人员集合。我知道要删除哪个人但不知道它属于哪个任务。

实现这一目标的最佳方法是什么?

谢谢!

格里特

    using System;

class ViewmodelPerson
{
    public ViewmodelPerson(LinqPerson P)
    {
        DBPerson = P;
    }
    LinqPerson DBPerson;
}

public class ViewmodelTask
{

    public ViewmodelTask(LinqTask DBTask)
    {
        this.DBTask = DBTask;
        _Persons = from P in DBTask.Person
                   select new ViewModelPerson(P);
    }

    LinqTask DBTask;

    List<ViewmodelPerson> _Persons;
    List<ViewmodelPerson> Persons
    {
        get
        {
            return _Persons;
        }
    }

    public void AddPerson(ViewmodelPerson P)
    {

    }
}

class BaseViewModel
{
    public List<ViewmodelTask> Tasks
    {
        get
        {
            // Code to get the tasks from Database via Linq
        }
    }
}

因为我无法获得该人所属的父任务,所以我只是将一个成员ParentTask添加到我的person类中。该成员需要在构造函数中传递。在ViewmodelPerson类上调用DeletePerson方法时,数据库中的Object被删除,我可以访问父Task对象,也可以清理List。然后调用IPropertyChanged的ChangedProperty(“Persons”),WPF就像魔法一样整理UI!

我只是想知道如果有很多人和任务,这种方法对内存消耗有很大的影响。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您有ContextMenu,但无法从其范围访问视图的DataContext。这是WPF中的常见问题,解决方案是将“DataContext”放入Tag属性,以后我们可以从ContextMenu检索:

<DataTemplate DataType="{x:Type YourNamespace:YourDataType}">
    <Border Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={
x:Type YourViewNamespace:NameOfThisControl}}}" ContextMenu="{StaticResource 
YourContextMenu}">
        ...
    </Border>
</DataTemplate>

然后,您需要使用名为Tag的便捷属性将此DataContext属性设置为ContextMenu的{​​{1}}:

PlacementTarget

要了解更多信息,请查看WPF Tutorial.NET上的Context Menus in WPF帖子。