Drag و Drop کردن در الگوی MVVM
برای اضافه کردن یه قابلیت جدید به برنامه ي OPMLtools نیاز به Drag&Drop داشتم.
برای انجام Drag&Drop تو حالت عادی تقریبا کار سختی نداریم ولی وقتی Drag&Drop رو تو MVVM بخوایم کار سخت میشه و…
بعد جستجو به فریمورک متن باز GongSolutions رسیدم که کار Drag&Drop رو تو MVVM خیلی ساده میکنه.
برای دانلود dll مربوطه میتونید از این روش کمک بگیرید یا از اینجا دانلود کنید.
و اما نحوه استفاده
همونطور که تو کد XAML بالا میبیند نحوه اضافه کردن قابلیت Drag&Drop خیلی سادس ویژگی های IsDragSource و IsDropTarget همونطور که از اسمشون پیداس مشخص میکنن که آیا کنترل مورد نظر میتونه مبدا و مقصد یک عمل Drag&Drop باشه.
قسمت مهم این کد مقید کردن هندلر رخداد Drop به ViewModel ما به کمک ویژگی DropHandler هست.
و اما تو ViewModel بازم کار برای ما راحت شده فقط کافیه اینترفیس IDropTarget رو پیاده سازی کنیم که شامل 2 متد DragOver و Drop میشه.
public void DragOver(DropInfo dropInfo) { if (dropInfo.Data is OpmlModel && dropInfo.TargetItem is OpmlModel) { dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight; dropInfo.Effects = DragDropEffects.Move; } }
کاری که ما تو متد DragOver اینه که آیا شی مبدا و مقصد ما تو عمل Drag&Drop معتبر هستن یا نه اگه بودن تزیین کننده (Adorner) ی عمل Drag&Drop رو ست میکنیم.
ویژگی dropInfo.Data شامل دیتای هست که Drag شده و dropInfo.TargetItem هم شامل دیتای هست که ماوس روش قرار گرفته(توجه کنید منظور از دیتا ;دیتای مقید شده به کنترل مورد نظر هست مثلا در اینجا شی OpmlModel)
public void Drop(DropInfo dropInfo) { var srcOpmlModel = (OpmlModel)dropInfo.Data; var trgOpmlModel = (OpmlModel)dropInfo.TargetItem; foreach (var ancestor in srcOpmlModel.Ancestors) { trgOpmlModel.Ancestors.Add(ancestor); } Opmls.Remove(srcOpmlModel); }
آخرین متد هم Drop هست و تمام.
نظرات
ارسال یک نظر