我有一个无法更改的数据模型,比如说:
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();