Mvvm模型ViewModel

时间:2015-08-26 10:19:21

标签: c# wpf mvvm

它可以被命名为MVVM模型吗?因为View与DataModel交互 ViewModelData。 View是否应仅与ViewModelData交互?我确实读过一些正确的MVVM模型应该在ViewModel中实现INotify但不在Model中。是不是?

namespace WpfApplication135
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModelData();
    }
}
public class ViewModelData
{
    public DataModel DM { get; set; }
    public ViewModelData()
    {
        DM = new DataModel();
    }
}
public class DataModel : INotifyPropertyChanged
{
    public int label;
    public int Label
    {
        get
        {
            return label;
        }

        set
        {
            label = value;
            RaisePropertyChanged("Label");
        }
    }
    public DataModel()
    {
        Action Update = new Action(Run);
        IAsyncResult result = Update.BeginInvoke(null, null);
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
    public void Run()
    {
        int i=0;
        while(true)
        {
            System.Threading.Thread.Sleep(2000);
            Label = ++i;
        }
    }
}
}

XAML

    <Grid>
    <Label Content="{Binding DM.Label}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>

</Grid>

2 个答案:

答案 0 :(得分:10)

MVVM最初的想法确实是View不应该知道(不依赖于)模型。

在实践中,这意味着在ViewModel中重新实现所有这些Model属性(参见下图中的浅黄色框),需要做很多工作。当您的模型可以轻松实现INPC时,例如从数据库模式生成时,会非常痛苦。数据库优先模式下的实体框架允许您通过T4模板注入INPC代码。

很快就达成共识,可以转发ViewModel.Model属性并绑定到该属性,就像您的DM属性一样。请参见图片中的浅蓝色框。

此图片中的问题非常清晰,请注意右上角的大量箭头。它们描述了各种解决方案,您可以使用它们的任意组合。

WPF LOB Apllication Layers - MVVM

答案 1 :(得分:0)

MVVM的一个观点是您的视图不应该知道您的数据模型,反之亦然。这就是为什么有ViewModel的原因。现在,您的ViewModel是浪费的代码。它什么都不做。

你可能想要更多地阅读MVVM,因为在这里解释它对于Q&amp; A格式而言过于宽泛。