سفارش تبلیغ
صبا ویژن

با سلام خدمت کلیه عزیزان و علاقه مندان به برنامه نویسی با Silverlight آن هم با استفاده از الگوی MVVM.
اگر این مقاله را دارید می خونید و تازه می خواهید با این الگو آشنا شویدبه سایر مقاله های بنده در سایت برنامه نویس مراجعه کنید:

الگوی M-VM-V در Silverlight و WPF
RIATasks: یک مثال ساده از CRUD در Silverlight
 
نحوه استفاده از کنترل Silverlight DataGrid در الگوی MVVM

در ضمن سورس این مثال رو در پایین همین صفحه قرار داده ام. به یاد داشته باشید این سورس وقتی کار می کند که شما دیتابیس مربوطه را که طی آموزش های قبلی ذکر شده در محل امضاء بنده ارائه شده است ساخته و رکوردهای لازم را در آن ایجاد کرده باشید.
خدمت سروران عزیزم عرض کنم که روش ذکر شده روشی ساده برای حذف رکورد از دیتاگرید و بالتبع آن از دیتابیس می باشد. روش دیگری وجود دارد که شما می توانید برای هر ردیف در دیتاگرید یک کلید Dlelete پیش بینی کنید که کمی پیچیده تر بوده و به نظر بنده زیاد جالب نیست. با این وجود اگر علاقه ای به این روش دارید می توانید روش ساخت آنرا در اینجا مطالعه کنید. نکته دیگر این که این آموزش در ادامه آموزش نحوه استفاده از کنترل Silverlight DataGrid در الگوی MVVM است. پس لطفا پیش از آموزش و اجرای این مقاله به مقاله اشاره شده مراجعه کنید. بریم سراغ آموزش:



برای حذف یک رکورد از جدول RIAComment ابتدا کد زیر را به Web Service موجود در پروژه RIADataGrid.Web افزوده و آنرا Build کنید:

1
2
3
4
5
6
7
8
9
10
11
12
13
#region DeleteRIACommetn
       [WebMethod]
       public RIAComment DeleteRIAComment(int RIACommentID)
       {
              RIATasksDBDataContext DB = new RIATasksDBDataContext();
              var result = (from RIAComments in DB.RIAComments
                    where RIAComments.CommentID == RIACommentID
                    select RIAComments).FirstOrDefault();
              DB.RIAComments.DeleteOnSubmit(result);
              DB.SubmitChanges();
              return result;
       }
       #endregion


سپس بر روی Service Reference wsRIARIAComments موجود در پروژه RIADataGrid کلیک راست کرده و گزینه Update Service Reference کلیک کنید.
حال به کلاس موجود در پوشه Model تحت عنوان RIACommentsModel.cs مراجعه کرده و کدهای زیر را به آن اضافه کنید:

1
2
3
4
5
6
7
8
9
10
#region DeleteRIAComment
       public static void DeleteRIAComment(int RIACommentID,
              EventHandler<DeleteRIACommentCompletedEventArgs> eh)
       {
              WebServiceSoapClient WS = new WebServiceSoapClient();
              WS.Endpoint.Address = new EndpointAddress(GetBaseAddress());
              WS.DeleteRIACommentCompleted += eh;
              WS.DeleteRIACommentAsync(RIACommentID);
       }
#endregion


جهت ساخت یک ICommand ساده که عملیات delete را اجرا می کند Command زیر را به کلاس MainPageModel.cs واقع در پوشه ViewModel اضافه کنید.

1
2
3
4
5
6
7
8
9
10
11
12
#region DeleteCommand
public ICommand DeleteCommand { get; set; }
public void Delete(object param)
{
   // Clear the Comment
    DeleteRIAComment((param as RIAComment).CommentID);
}
private bool CanDelete(object param)
{
    return ((param as RIAComment) != null);
}
#endregion


جهت ساخت Command فوق کد زیر را به سازنده MainPageModel.cs اضافه کنید:

1
DeleteCommand = new DelegateCommand(Delete, CanDelete);


ICommand فوق متد زیر را برای اجرای واقعی عملیات Delete فراخوانی می کند و موجب پاک شدن ایتم حذف شده از Collection ی می شود که DataGrid به آن مقید شده است (این چیزی است که موجب حذف ردیف در DataGrid می شود).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#region DeleteRIAComment
private void DeleteRIAComment(int CommentID)
{
    // Call the Model to UpdateRIAComment the RIAComment
    RIACommentsModel.DeleteRIAComment(CommentID, (Sender, EventArgs) =>
    {
        if (EventArgs.Error == null)
       {
            // Find the comment
            var CommentInCollection =
                (from comment in colRIAComments
                 where comment.CommentID == EventArgs.Result.CommentID
                 select comment).FirstOrDefault();
            if (CommentInCollection != null)
            {
                // Remove it
                colRIAComments.Remove(CommentInCollection);
            }
            // Show any errors
            Errors = EventArgs.Result.Errors;
            // Set the visibility of the Message ListBox
            MessageVisibility = (Errors.Count > 0) ?
                Visibility.Visible : Visibility.Collapsed;
        }
    });
}
#endregion


ساخت View
روی MainPage.xaml کلیک راست کرده و گزینه Open Expression Blend . . . را انتخاب کنید:

یک دکه به پایین صفحه اضافه کنید.

در قسمت Preperty دکمه، روی Advanced options در قسمت Command کلیک کنید.

گزینه Data Binding . . . را انتخاب کنید.

در بخش Data Context گزینه DeleteCommand را انتخاب و OK کنید.

مجدداً در خواص مربوط به دکمه افزوده شده، روی Advanced options مربوط به command Parameter کلیک کنید.

گزینه Data Binding . . . را انتخاب کنید.

در قسمت Element Property گزینه dataGrid را انتخاب کرده و در قاب سمت راست گزینه SelectedItem و نهایتاً روی OK کلیک کنید.
اجرای پروژه

وقتی پروژه Build شده و اجرا شد، توجه کنید که دکمه مربوط به Delete غیر فعال است چون هیچ ردیفی از دیتاگرید انتخاب نشده است. این اتفاق به این دلیل است که متد CanDelete موجود در View Model وقتی که ردیفی انتخاب نشده باشد و هیچ پارامتری به متد پاس نشده باشد، مقدار False برمی گرداند

اگر روی ردیفی کلیک کنید، دکمه مربوطه فعال شده و جهت حذف رکورد می توانید روی آن کلیک کنید.
می توانید کدهای برنامه را از لینک زیر دانلود کنید:
http://silverlight.adefwebserver.com...leteButton.zip


اولین دیدگاه را شما بگذارید Silverlight ، MVVM ، Expression Blend ،

 دانلود...       استفاده...

مشخصات مدیر وبلاگ

محمد محمدی پیروز [33]

دل نوشته ها و تجربه های یک برنامه نویس
ویرایش

لوگوی دوستان



ویرایش

طراحی پوسته توسط تیم پارسی بلاگ