我需要你关于模型到ViewModel MVVM的循环的建议

时间:2018-03-07 14:38:28

标签: loops mvvm

我是WPF和MVVM的新手,我被赋予了继续处理使用该技术制作的未完成项目之一的任务。我在下面编写了一个类似于项目结构的示例代码。

我担心的是, GetBookPages()中使用的循环显示网格上的详细信息可能需要一些时间才能完成。

public class BookModel
{
    public string BookTitle { get; set; }
    public List<BookDetailModel> BookDetails { get; set; }
}

public class BookDetailModel
{
    public int Pages { get; set; }
    public string Others { get; set; }
    // .... 
}

public class BookViewModel : INotifyPropertyChanged
{
    private BookModel _model;
    private ObservableCollection<BookDetailViewModel> _bookDetailSource;
    private BookService _service;

    public BookViewModel()
    {
        _model = new BookModel();
        _service = new BookService();
         GetBookPages();
    }

    /// <summary>
    /// This is the item source of datagrid that is located in view
    /// </summary>
    public ObservableCollection<BookDetailViewModel> BookDetailSource
    {
        get { return _bookDetailSource; }
        set
        {
            if (value == _bookDetailSource)
                return;

            _bookDetailSource = value;
            OnPropertyChanged();
        }
    }

    private void GetBookPages()
    {

        BookModel bookModel = _service.GetBookData();
        var listOf = new List<BookDetailViewModel>();
        bookModel.BookDetails.ForEach(e =>
        {
            // This is were the system's bottle neck is.
            // can someone please suggests me a good work around.
            listOf.Add(
                new BookDetailViewModel
                {
                    Others = e.Others,
                    // ....
                });
        });

        BookDetailSource = new ObservableCollection<BookDetailViewModel>(listOf);
    }

    public string BookTitle
    {
        get { return _model.BookTitle; }
        set
        {
            if (value == _model.BookTitle)
                return;

            _model.BookTitle = value;
            OnPropertyChanged();
        }
    }

    #region Property Change
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}


public class BookDetailViewModel : INotifyPropertyChanged
{

    private BookDetailModel _model;

    #region Constructor

    public BookDetailViewModel()
    {
        _model = new BookDetailModel();

        ViewPageDataCommand = new RelayCommand(x => ViewPageData());
        RemovePageCommdand = new RelayCommand(x => RemovePage());
    }
    #endregion

    #region Properties

    public int Page
    {
        get { return _model.Pages; }
        set
        {
            if (value == _model.Pages)
                return;

            _model.Pages = value;
            OnPropertyChanged();
        }
    }

    public string Others
    {
        get { return _model.Others; }
        set
        {
            if (value == _model.Others)
                return;

            _model.Others = value;
            OnPropertyChanged();
        }
    }
    #endregion

    // These are the button command inside the grid's row
    public ICommand ViewPageDataCommand { get; private set; }
    public ICommand RemovePageCommdand { get; private set; }

    private void ViewPageData()
    {
        // view the page data by clicking the row button inside the grid
    }
    private void RemovePage()
    {
        // will remove the currently selected row inside the grid
    }

    #region Property Change
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

public class BookService
{
    public BookModel GetBookData()
    {
        var data = GetBookData(99);
        data.BookDetails = GetBookDetail(99);

        return data;
    }

    private BookModel GetBookData(int bookId)
    {
        // return 1 row only
    }

    private List<BookDetailModel> GetBookDetail(int bookId)
    {
        // return List<BookDetailModel> that might consists of more than 100 index's
    }
}

我希望你理解我的意思。您的建议将不胜感激。提前谢谢!

0 个答案:

没有答案