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

View Model
CRUD با استفاده از View Model
پوشه ای به نام ViewModels به پروژه ایجاد کرده و کلاسی تحت عنوان MainPageModel.cs به آن اضافه کنید. تمامی کدهای زیر را در آن جایگزین کنید:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows;
using RIATasks.wsRIATasks;

namespace RIATasks
{
public class MainPageModel : INotifyPropertyChanged
{
public MainPageModel()
{
// Set the command property
GetTasksCommand = new DelegateCommand(GetTasks, CanGetTasks);
GetTaskCommand = new DelegateCommand(GetTask, CanGetTask);
DeleteTaskCommand = new DelegateCommand(DeleteTask, CanDeleteTask);
UpdateTaskCommand = new DelegateCommand(UpdateTask, CanUpdateTask);
AddNewTaskCommand = new DelegateCommand(AddNewTask, CanAddNewTask);

// The following line prevents Expression Blend
// from showing an error when in design mode
if (!DesignerProperties.IsInDesignTool)
{
// Get the Tasks for the current user
GetTasks();

// Set Visibility
HasCurrentTask = Visibility.Collapsed;
AddVisibility = Visibility.Visible;
UpdateVisibility = Visibility.Collapsed;
DeleteVisibility = Visibility.Collapsed;
}
}



// Utility

#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
#endregion
}
}

این کد INotifyPropertyChanged را که توسط Properties استفاده می شود ( در مراحل بعدی ایجاد خواهند شد) پیاده سازی می کند. این عمل موجب می شود که هر گونه تغییر و به روزرسانی در Properties در View قابل مشاهده باشد.
سازنده ()MainPageModel، بعضی از ICommand ها را که در مراحل بعدی به طور کامل تعریف خواهند شد، راه اندازی خواهد کرد. همچنین متد ()GetTasks را که موجب فراخوانی Model (که موجب فراخوانی web service خواهد شد) می شود را فراخوانی می کند و تمامی Task های کاربری را که به نرم افزار ورود پیدا کرده است را بازیابی می کند.
نکته: شما خطوط قرمز مواجی را زیر خطوط این کد مشاهده خواهید کرد زیرا مجموعه property ها و command ها هنوز به طور کامل تعریف نشده اند.
کدهای زیر را به به این کلاس اضافه کنید:

// Properties

#region CurrentTask
private Task _CurrentTask = new Task();
public Task CurrentTask
{
get { return _CurrentTask; }
private set
{
if (CurrentTask == value)
{
return;
}
_CurrentTask = value;
this.NotifyPropertyChanged("CurrentTask");
}
}
#endregion

#region AddVisibility
private Visibility _AddVisibility = Visibility.Visible;
public Visibility AddVisibility
{
get { return _AddVisibility; }
private set
{
if (AddVisibility == value)
{
return;
}
_AddVisibility = value;
this.NotifyPropertyChanged("AddVisibility");
}
}
#endregion

#region UpdateVisibility
private Visibility _UpdateVisibility = Visibility.Visible;
public Visibility UpdateVisibility
{
get { return _UpdateVisibility; }
private set
{
if (UpdateVisibility == value)
{
return;
}
_UpdateVisibility = value;
this.NotifyPropertyChanged("UpdateVisibility");
}
}
#endregion

#region DeleteVisibility
private Visibility _DeleteVisibility = Visibility.Visible;
public Visibility DeleteVisibility
{
get { return _DeleteVisibility; }
private set
{
if (DeleteVisibility == value)
{
return;
}
_DeleteVisibility = value;
this.NotifyPropertyChanged("DeleteVisibility");
}
}
#endregion

#region HasTasks
private Visibility _HasTasks = Visibility.Collapsed;
public Visibility HasTasks
{
get { return _HasTasks; }
private set
{
if (HasTasks == value)
{
return;
}
_HasTasks = value;
this.NotifyPropertyChanged("HasTasks");
}
}
#endregion

#region HasCurrentTask
private Visibility _HasCurrentTask = Visibility.Collapsed;
public Visibility HasCurrentTask
{
get { return _HasCurrentTask; }
private set
{
if (HasCurrentTask == value)
{
return;
}
_HasCurrentTask = value;
this.NotifyPropertyChanged("HasCurrentTask");
}
}
#endregion

#region Message
private string _Message;
public string Message
{
get { return _Message; }
private set
{
if (Message == value)
{
return;
}
_Message = value;
this.NotifyPropertyChanged("Message");
}
}
#endregion

مقدار کدها به نظر زیاد میاید اما آنها فقط Property هایی هستند که دادهایی را که قرار است در View به نمایش در آیند، در خود نگه می دارند. تغییر در هر کدام از Property ها موجب بالا آمدن NotifyPropertyChanged خواهد شد.
کدهای زیر را نیز به انتهای کلاس فوق اضافه کنید:

// Collections

#region colTasks
private ObservableCollection<Task> _colTasks
= new ObservableCollection<Task>();
public ObservableCollection<Task> colTasks
{
get { return _colTasks; }
private set
{
if (colTasks == value)
{
return;
}
_colTasks = value;
this.NotifyPropertyChanged("colTasks");
}
}
#endregion

کد فوق شبیه یک Property است اما در واقع یک Collection از Task ها است ( به جای یک تک مقدار یا Task).
هنوز ادامه دارد. لطفا کدهای زیر را نیز به انتهای همان کلاس اضافه کنید:

// Operations

#region GetTasks
private void GetTasks()
{
// Clear the current Tasks
colTasks.Clear();
// Call the Model to get the collection of Tasks
TasksModel.GetTasks((Param, EventArgs) =>
{
if (EventArgs.Error == null)
{
// loop thru each item
foreach (var Task in EventArgs.Result)
{
// Add to the colTasks collection
colTasks.Add(Task);
}

// Count the records returned
if (colTasks.Count == 0)
{
// If there are no records, indicate that
Message = "No Records Found";

// Set HasCurrentTask
HasCurrentTask = Visibility.Collapsed;

// We have no Tasks so set HasTasks
HasTasks = Visibility.Collapsed;
}
else
{
// We have Tasks so set HasTasks
HasTasks = Visibility.Visible;
}
}
});
}
#endregion

#region GetTask
private void GetTask(int intTaskID)
{
// Call the Model to get the Task
TasksModel.GetTask(intTaskID, (Param, EventArgs) =>
{
if (EventArgs.Error == null)
{
// Set the CurrentTask Property
CurrentTask = EventArgs.Result;

// Set Visibility
HasCurrentTask = Visibility.Visible;
AddVisibility = Visibility.Visible;
UpdateVisibility = Visibility.Visible;
DeleteVisibility = Visibility.Visible;
}
});
}
#endregion

#region DeleteTask
private void DeleteTask(Task objTask)
{
// Call the Model to delete the Task
TasksModel.DeleteTask(objTask.TaskID, (Param, EventArgs) =>
{
if (EventArgs.Error == null)
{
// Set the Error Property
Message = EventArgs.Result;

// Set current Task to null
CurrentTask = null;

// Update the Tasks list
GetTasks();

// Set Visibility
HasCurrentTask = Visibility.Collapsed;
AddVisibility = Visibility.Visible;
UpdateVisibility = Visibility.Collapsed;
DeleteVisibility = Visibility.Collapsed;
}
});
}
#endregion

#region UpdateTask
private void UpdateTask(Task objTask)
{
// Call the Model to UpdateTask the Task
TasksModel.UpdateTask(objTask, (Param, EventArgs) =>
{
if (EventArgs.Error == null)
{
// Set the Error Property
Message = EventArgs.Result;

// Update the Tasks list
GetTasks();

// Set Visibility
HasCurrentTask = Visibility.Visible;
AddVisibility = Visibility.Visible;
UpdateVisibility = Visibility.Visible;
DeleteVisibility = Visibility.Visible;
}
});
}
#endregion

#region InsertTask
private void InsertTask(Task objTask)
{
// Call the Model to Insert the Task
TasksModel.InsertTask(objTask, (Param, EventArgs) =>
{
if (EventArgs.Error == null)
{
// Set the CurrentTask Property
CurrentTask = EventArgs.Result;

// Update the Tasks list
GetTasks();

// Set Visibility
HasCurrentTask = Visibility.Visible;
AddVisibility = Visibility.Visible;
UpdateVisibility = Visibility.Visible;
DeleteVisibility = Visibility.Visible;
}
});
}
#endregion

#region SetToNewTask
private void SetToNewTask()
{
// Create a empty Task
// so form will be blank
Task objTask = new Task();

// Set TaskID = -1 so we know it"s
// a new Task
objTask.TaskID = -1;

// Set the CurrentTask Property
CurrentTask = objTask;

// Set Visibility
HasCurrentTask = Visibility.Visible;
AddVisibility = Visibility.Collapsed;
UpdateVisibility = Visibility.Visible;
DeleteVisibility = Visibility.Collapsed;
}
#endregion

یک سری عملیاتهایی وجود دارد که ViewModel آنها را اجرا خواهد کرد. در واقع توابع یا متدهایی هستند که کارهای واقعی را انجام می دهند. اکثر این متدها صرفاً متدهای Model را فراخوانی می کنند.
کدهای زیر را به انتهای کلاس اضافه کنید:

// Commands

#region GetTasksCommand
public ICommand GetTasksCommand { get; set; }
public void GetTasks(object param)
{
GetTasks();
}

private bool CanGetTasks(object param)
{
return true;
}
#endregion

#region GetTaskCommand
public ICommand GetTaskCommand { get; set; }
public void GetTask(object param)
{
// Get the Task that was passed as a parameter
Task objTask = (Task)param;

// Call GetTask to get and set
// the CurrentTask property
GetTask(objTask.TaskID);
}

private bool CanGetTask(object param)
{
// Only allow this ICommand to fire
// if a Task was passed as a parameter
return ((param as Task) != null);
}
#endregion

#region DeleteTaskCommand
public ICommand DeleteTaskCommand { get; set; }
public void DeleteTask(object param)
{
if (CurrentTask.TaskID == -1)
{
// This is a new Task
SetToNewTask();
}
else
{
// This is an Existing Task
DeleteTask(CurrentTask);
}
}

private bool CanDeleteTask(object param)
{
// Do not allow if there is no Current Task
return (CurrentTask != null);
}
#endregion

#region UpdateTaskCommand
public ICommand UpdateTaskCommand { get; set; }
public void UpdateTask(object param)
{
if (CurrentTask.TaskID == -1)
{
// This is a new Task
InsertTask(CurrentTask);
}
else
{
// This is an Update
UpdateTask(CurrentTask);
}
}

private bool CanUpdateTask(object param)
{
// Do not allow if there is no Current Task
return (CurrentTask != null);
}
#endregion

#region AddNewTaskCommand
public ICommand AddNewTaskCommand { get; set; }
public void AddNewTask(object param)
{
SetToNewTask();
}

private bool CanAddNewTask(object param)
{
return true;
}
#endregion

این کدها نیز ICommand ها بودند. کدهایی که توسط View فراخوانی خواهند شد.
CRUD با استفاده از View Model
در Visual Studio از منوی Build گزینه Build RIATasks را انتخاب کنید. پروژه می بایست بدون هرگونه خطای Build شود.
در مرحله بعدی به ساخت View و ارتباط آن با Command ها و Property ها خواهیم پرداخت.


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

 حذف ردیف...   

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

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

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

لوگوی دوستان



ویرایش

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