使用MvvmCross,转换模型以查看要在列表中显示的模型的最佳实践是什么?

时间:2016-09-28 17:20:16

标签: c# mvvm mvvmcross

我有一个无法更改的数据模型,比如说:

public class TodoItem
{
    public string Id { get; set; }

    [JsonProperty(PropertyName = "userid")]
    public Guid UserId { get; set; }

    [JsonProperty(PropertyName = "text")]
    public string Text { get; set; }

    [JsonProperty(PropertyName = "complete")]
    public bool Complete { get; set; }
}

在线服务返回ObservableCollection。我想在我的视图中显示这一点,但我需要添加PropertyChanged,以及一些与完成切换相关的静态操作,可能使用MvxViewModel作为基类。有什么好的MvvmCross方法可以将模型转换为视图模型,同时仍然确保视图模型中的更改会更改模型?您是否可以在视图模型对象中引用原始对象?

public class ToDoItemViewModel : MvxViewModel
{
    private TodoItem _item;

    public ToDoItemViewModel(TodoItem item)
    {
        _item = item;
    }

    public Guid UserId
    {
        get
        {
            return _item.UserId;
        }
        set
        {
            if (_item.UserId == value) return;
            _item.UserId = value;
            RaisePropertyChanged(() => UserId);
        }
    }

    public string Text
    {
        get
        {
            return _item.Text;
        }
        set
        {
            if (_item.Text == value) return;
            _item.Text = value;
            RaisePropertyChanged(() => Text);
        }
    }

    public bool Complete
    {
        get
        {
            return _item.Complete;
        }
        set
        {
            if (_item.Complete == value) return;
            _item.Complete = value;
            RaisePropertyChanged(() => Complete);
            CompleteChanged.Invoke(_item);
        }
    }

    public static Action<TodoItem> CompleteChanged;
}

如果是这样,是否可以自动生成它,以便它不会重写ViewModel中的所有属性,而是跟踪模型属性?在视图模型中保持对原始项的引用是否明智?

以下是我从ObservableCollection<TodoItem>ObservableCollection<TodoItemViewModel>

的方式
        var todoItems = await todoTable
            .Where(todoItem => todoItem.Complete == false)
            .ToCollectionAsync();
        Items = new ObservableCollection<TodoItemViewModel>(todoItems.Select(i => new TodoItemViewModel(i)));

更新。轻微的快捷方式

            Items = await _todoTable
                .Where(item => item.Complete == false)
                .Select(item => new TodoItemViewModel(item))
                .ToCollectionAsync();

0 个答案:

没有答案