我的ViewModel是否具有Model和各个属性的属性?

时间:2013-05-09 06:48:59

标签: c# .net wpf mvvm caliburn.micro

我有一个具有以下属性的模型:

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似乎无法绑定到属性的属性,所以我看不到解决方法。

我是否走上正轨,是否有更简单或更好的方式?

2 个答案:

答案 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的好方法,这可能不一定反映模型的形状