0

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

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

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

谢谢!

格里特

    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 添加到我的人员类中。该成员需要在构造函数中传递。当在 ViewmodelPerson 类上调用 DeletePerson 方法时,对象在数据库中被删除,我可以访问父任务对象并且也可以清理列表。之后调用 IPropertyChanged 的​​ ChangedProperty("Persons") 并且 WPF 像魔术一样整理 UI!

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

4

1 回答 1

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为:DataContextContextMenuPlacementTarget

<ContextMenu x:Key="YourContextMenu" DataContext="{Binding PlacementTarget.Tag, 
RelativeSource={RelativeSource Self}}">
    <MenuItem Header="First Item" Command="{Binding CommandFromYourViewModel}" />
</ContextMenu>

要了解更多信息,请查看WPF Tutorial.NET 上的 WPF 中的上下文菜单。

于 2013-09-05T13:24:38.803 回答