我的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 ModelModel上有一个属性:

public Authorization auth {get; set;};

然后是一个"映射"方法来推/拉View Model属性和Model属性之间的数据?

这份原稿。Micro似乎无法绑定到一个属性的属性,所以我没有找到解决这个问题的方法。

我在正确的轨道上,有没有一个更简单或更好的方法?

我的ViewModel有Model的属性和单独的属性吗?

您的建议听起来很合理,但是您的示例代码目前没有通知,因此您将无法使用绑定。简单地从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中,这可能不一定反映模型的形状