我的ViewModel有Model的属性和单独的属性吗?
本文关键字:属性 单独 ViewModel Model 我的 | 更新日期: 2023-09-27 18:12:41
我有一个具有以下属性的模型:
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
或Model
上有一个属性:
public Authorization auth {get; set;};
然后是一个"映射"方法来推/拉View Model
属性和Model
属性之间的数据?
这份原稿。Micro似乎无法绑定到一个属性的属性,所以我没有找到解决这个问题的方法。
我在正确的轨道上,有没有一个更简单或更好的方法?
您的建议听起来很合理,但是您的示例代码目前没有通知,因此您将无法使用绑定。简单地从BindableBase
派生是不够的,你需要调用BindableBase
中的任何方法,在你的属性设置中触发NotifyPropertyChanged
。
查看calburn .micro
中的视图模型类示例使用View Model
提供可绑定的属性,表示您希望在GUI中使用的Model
数据。编写代码,使用各自的Model
属性值更新View Model
属性,在View Model
属性设置中,您可以通过auth
属性更新您的模型。
您评论的方法:
拉下我的Model属性,调用方法给ViewModel赋值属性,通过绑定在UI上进行更改,这些更改会被反射回来到ViewModel属性,在Save调用方法上分配ViewModel属性返回到Model属性的属性,并保存到my数据库从我的视图模型传递模型属性
听起来很合理——但据我回忆,CM可以绑定到一个属性的属性(您也可以显式绑定失败)
您只需要使用下划线_来分隔控件
的Name
的绑定路径。
<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中,这可能不一定反映模型的形状