0

最初のレベルにタスクのリストを表示する WPF に TreeView コントロールがあります。各タスクには人のリストがあります。タスクと人の両方がデータベースに保存されます。Linq2Sql クラスをカプセル化する 2 つのビューモデル クラスを作成しました。TreeView は、viewmodel クラスを参照する 2 つの階層的な DataTemplates で構成されます。データの表示はうまく機能し、問題なくタスクと人を追加できます。

しかし、コンテキストメニューからタスクの下の人を削除したいという問題があります。私の問題は、親タスクにアクセスできないため、人のコレクションを更新できないことです。どの人を削除するかはわかっていますが、その人がどのタスクに属しているかはわかりません。

これを達成するための最良の方法は何ですか?

ありがとう!

ゲリット

    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 メソッドが呼び出されると、オブジェクトがデータベースから削除され、親の Task オブジェクトにアクセスできるようになり、List もクリーンアップできます。その後、IPropertyChanged の ChangedProperty("Persons") が呼び出され、WPF が魔法のように UI を整理します。

多くの人やタスクがある場合、このアプローチがメモリ消費に大きな影響を与えるかどうか疑問に思っていました。

4

1 に答える 1

0

私があなたを正しく理解している場合、あなたは を持っていますが、そのスコープからビューの にContextMenuアクセスすることはできません。DataContextこれは WPF の一般的な問題であり、解決策は、後で から取得できるプロパティに 'put the DataContext' を入れることです。TagContextMenu

<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 に答える