3

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

public class Authorization : BindableBase
{                 
    public int id {get; set;}

    public string member {get; set;}

    public DateTime startDate {get; set;}
}

现在View Model需要为.View

这是否意味着我View Model的 my上也应该有一个属性Model

public Authorization auth {get; set;};

View Model然后是在属性和属性的属性之间推/拉数据的“映射”方法Model

Caliburn.Micro 似乎无法绑定到属性的属性,所以我看不到解决方法。

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

4

2 回答 2

2

您的建议听起来很合理,但您的示例代码目前没有通知,因此您将无法使用绑定。简单地派生BindableBase是不够的,你需要在你的属性设置器中BindableBase调用任何方法。NotifyPropertyChanged

查看caliburn.micro 中的示例视图模型类

使用您View Model提供可绑定的属性,表示Model您希望在 GUI 中使用的数据。编写代码以View Model使用相应的Model属性值更新您的属性,并且在View Model属性设置器中,您可以通过您的auth属性更新您的模型。

于 2013-05-09T07:04:35.083 回答
1

您评论的方法:

下拉我的 Model 属性,调用方法来为 ViewModel 属性分配值,通过绑定在 UI 上进行更改,这些更改反映回 ViewModel 属性,在 Save 调用方法上将 ViewModel 属性分配回 Model 属性的属性并保存到我的数据库从我的视图模型中传递模型属性

听起来很合理 - 但据我所知,CM可以绑定到属性的属性(您也可以显式绑定失败)

您只需要使用下划线 _ 来分隔Name控件的绑定路径

例如

<Button x:Name="SomeObject_SomeProperty" />

现在我从未尝试过,但ViewModelBinderCM 源代码中的这段代码似乎表明它可以工作:

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

于 2013-05-09T08:56:42.537 回答