从视图访问Model类,无需直接访问模型层

RAM*_*RAM 3 c# wpf mvvm

我需要创建一个Property在我的用户控件的一个Model类型,但我想我必须避免直接进入Model LayerView Layer.

我有一个View ModelModel是提供一套我的模型对象 ...

  • SetOfA_UserControl
  • SetOfA_ViewModel
  • 一个模型

我需要一个属性在我的用户控件中这样:

public A_Model SelectedA { get; set; }
Run Code Online (Sandbox Code Playgroud)

一种方法是创建一个新的View Model类似下面的代码,并在我的使用它User Control:

// ------------ View Model Layer ------------

public class SingleA_ViewModel: ModelA
{
}

// --------------- View Layer ---------------

public SingleA_ViewModel SelectedA { get; set; }
Run Code Online (Sandbox Code Playgroud)

但我试图阻止一个新的空视图模型类继承上面的模型.这是对的吗?

你有什么建议阻止直接访问Model layer和创建Property我的User Control???


编辑1:

我有3个项目:

  • 查看项目
  • 查看模型项目
  • 示范项目

我想知道我能阻止参考Model projectView project或不....

我有一个SelectedA在我看来Model属性也是一样,我把我的逻辑View model class,它在我看来,工作得很好,但我也有一个SelectedA在我的财产UserControl,我把它绑定到SelectedA我的财产ViewModel类......但我需要直接访问ModelUserControl以定义这个属性!

当我ModelView我的代码直接访问时是这样的:

// ------------ Model Layer ------------
public class AModel
{
}

// ------------ View Model Layer ------------
public class SetOfA_ViewModel: INotifyPropertyChanged
{
    public AModel SelectedA { get; set; }

    public ObservableCollection<AModel> Items
    {
        get { return _items; }
        set
        {
            _items = value;
            OnPropertyChanged("Items");
        }
    }

    // Other Logic codes to fill and keep SelectedA value and....
}



// --------------- View Layer ---------------
public partial class MyUserControl : UserControl
{
    public AModel SelectedA { 
    get { return (AModel)GetValue(SelectedAProperty); }
        set
        {
            var oldValue = (AModel)GetValue(SelectedAProperty);
            if (oldValue != value) SetValue(SelectedAProperty, value);
        }
    }

    public static readonly DependencyProperty SelectedAProperty =
        DependencyProperty.Register(
            "SelectedA",
            typeof(AModel),
            typeof(MyUserControl),
            new PropertyMetadata(OnSelectedAValueChanged));

    public MyUserControl ()
    {
        InitializeComponent();

        const string NAME_OF_PROPERTY_IN_VM = "SelectedA";
        var binding = new Binding(NAME_OF_PROPERTY_IN_VM) { Mode = BindingMode.TwoWay };
        this.SetBinding(SelectedAProperty, binding);
    }

    private static void OnSelectedAValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        //------
    }  
}
Run Code Online (Sandbox Code Playgroud)

上面的方法对我来说工作得很好,我现在用的这个我试图删除的任何直接访问和引用Model Project在我View Project那我怎么才能实现SelectedA的依赖属性AModel在我的user control

有些朋友说你可以直接从view项目访问模型项目.我想知道Correct ways,不是 possible ways ......!


编辑2

当我在我的用户控件中保留SelectedA项目时,然后在我的窗口中使用它,如下所示:

<userControls:MyUserControl x:Name="MyUserControl1"/>

<Label Content="{Binding ElementName=MyUserControl1, Path=SelectedA.Title}" />
Run Code Online (Sandbox Code Playgroud)

编辑3

为什么我要阻止从ViewModel直接访问Model?

我搜索了MVVM图,但没有找到并直接从View访问模型.所有图表都说:

在此输入图像描述

..........在此输入图像描述

现在我们可以从视图直接访问模型了吗?

  • 为什么有许多样本可以在网络上的View中直接访问模型?

  • 为什么有些人说你可以这样做?

  • 如果我们可以这样做并直接访问模型是一个正确的实现,为什么在上图中View和Model之间没有任何关系?

Ern*_*rno 5

视图模型不是模型,因此不应该派生.

如果您决定将视图耦合到模型,则模型中的任何更改(通常由外部源指定)都可能会影响其使用的视图.

当为每个视图使用viewmodel时,某些视图可能根本不受更改影响,并且可以通过调整视图或在viewmodel中编写代码来修复受影响的视图.

是的,在它们之间添加一个额外的图层是额外的工作,但它也带有从视图到模型再转回的明确点.经过几次增量后,它可能是值得的.

额外的层还为命令和验证以及查看特定属性提供了一个很好的扩展点.

如果您决定将模型公开为viewmodel的属性,那么向属于视图的模型添加属性和命令会变得非常诱人.它们会快速污染模型,使模型难以重复使用或重新生成.

没有法律也没有警察.考虑我的论点并选择一个选项.尝试以后更改您的设计.现在看似简单的事情可能会在以后变得困难.我们不知道会发生什么; 敏捷/灵活.根据我的经验,我发现对于在许多版本中存活的应用程序,在模型和视图模型之间进行清晰分离会更有效,但对于短期应用程序来说,它可能太多了.

在实现MVVM模式时,我总是确保模型不知道或假设有关viewmodel的任何内容,并且viewmodel不知道或假设有关视图的任何内容.视图模型是中间的人; 它知道在哪里获取模型的实例以及在何处发送模型的更改.很多时候我使用过一个或多个知道如何获取或保存模型实例的存储库,因此viewmodel只需知道存储库.存储库可以注意或委托其他功能,例如跨视图模型实例进行缓存.

通常,我为每个视图创建一个viewmodel,并将viewmodel的实例分配给视图的datacontext.所有绑定路径(对于属性和命令)都与该视图模型相关.

有时我通过向主视图模型添加属性视图模型本身来嵌套视图模型.