最初のレベルにタスクのリストを表示する 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 を整理します。
多くの人やタスクがある場合、このアプローチがメモリ消費に大きな影響を与えるかどうか疑問に思っていました。