我有一个具有以下属性的模型:
public class Authorization : BindableBase
{
public int id {get; set;}
public string member {get; set;}
public DateTime startDate {get; set;}
}
现在我的View Model
我需要为View
提供相同的( ish )属性。
这是否意味着我应该在我View Model
的{{1}}上拥有一个属性:
Model
然后使用“映射”方法在public Authorization auth {get; set;};
属性和View Model
属性的属性之间推送/拉取数据?
Caliburn.Micro似乎无法绑定到属性的属性,所以我看不到解决方法。
我是否走上正轨,是否有更简单或更好的方式?
答案 0 :(得分:2)
您的建议听起来很合理,但您的示例代码目前尚未通知,因此您将无法使用绑定。仅仅从BindableBase
派生是不够的,您需要在财产制定者的BindableBase
火灾NotifyPropertyChanged
中调用任何方法。
查看this for an example viewmodel class in caliburn.micro
使用您的View Model
提供表示您希望在GUI中使用的Model
数据的可绑定属性。编写代码以使用相应的View Model
属性值更新Model
属性,并在View Model
属性设置器中通过auth
属性更新模型。
答案 1 :(得分:1)
您评论的方法:
下拉我的Model属性,调用方法为ViewModel赋值 属性,通过绑定在UI上进行反射回来的更改 到ViewModel属性,在Save调用方法上分配ViewModel 属性返回到Model属性的属性并保存到我的 DB从我的View Model
传递Model属性
听起来很合理 - 但据我所知,CM可以绑定到属性的属性(你也可以显式绑定失败)
您只需要使用下划线_来分隔控件Name
的绑定路径
e.g。
<Button x:Name="SomeObject_SomeProperty" />
现在我从来没有尝试过,但ViewModelBinder
CM来源中的这段代码似乎表明它可行:
var cleanName = element.Name.Trim('_');
var parts = cleanName.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries);
var property = viewModelType.GetPropertyCaseInsensitive(parts[0]);
var interpretedViewModelType = viewModelType;
for (int i = 1; i < parts.Length && property != null; i++)
{
interpretedViewModelType = property.PropertyType;
property = interpretedViewModelType.GetPropertyCaseInsensitive(parts[i]);
}
...etc
如果您确实需要手动映射,那么AutoMapper是一个很好用的库 - 您可以在映射中重塑数据,这是将模型数据转换为ViewModel的好方法,这可能不一定反映模型的形状