【问题标题】:Does my ViewModel have a property of the Model and individual properties?我的 ViewModel 是否具有 Model 的属性和单独的属性?
【发布时间】:2013-05-03 14:11:49
【问题描述】:

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

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 属性的属性之间推/拉数据的“映射”方法?

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

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

【问题讨论】:

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


    【解决方案1】:

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

    查看this for an example viewmodel class in caliburn.micro

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

    【讨论】:

    • 是的,谢谢 BindableBase 和 INPC。我实际上正在使用它们,为了简单起见,我只是在我的帖子中将其删除。也许是一个错误......无论如何,粗略的操作顺序会像这样:拉下我的模型属性,调用方法以将值分配给 ViewModel 属性,通过绑定在 UI 上进行更改,这些更改会反映回 ViewModel 属性,在 Save 调用方法将 ViewModel 属性分配回 Model 属性的属性并保存到我的 DB,从我的 View Model 传递 Model 属性。
    • 这对我来说听起来不错,这样您就可以通过 ViewModel 从数据库中抽象出您的视图;你的 View 只知道你的 ViewModel 并且你的 ViewModel 有你的 Model 的引用。
    【解决方案2】:

    你评论的方法:

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

    听起来很合理 - 但据我所知,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 的好方法,而 ViewModel 可能不一定反映模型的形状

    【讨论】:

      猜你喜欢
      • 2014-01-12
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2020-02-14
      • 2011-11-16
      • 1970-01-01
      • 2014-12-20
      • 2018-09-06
      相关资源
      最近更新 更多