如果存储库在视图模型中是禁止的,如何从绑定到ViewModel的DetailView中保存数据?

时间:2010-09-16 20:49:09

标签: wpf mvvm view save viewmodel

我们mvvm爱好者都知道Josh Smith mvvm示例以及他如何通过将存储库对象注入customerViewModel的构造函数来保存客户的详细客户视图。

但是视图模型不应该知道存储库。它只是一个视图的模型,没有必要意识到持久性等......

如果将其设置在代码隐藏中,如何在DocumentViewModel上注册我的Action委托SaveDocumentDelegate?实际上我应该在我的DocumentController中订阅委托但是如何在DocumentController中实例化DocumentView并将其设置为Datacontext,而不是在代码隐藏中执行此操作。我想到的只是在窗口中使用contentcontrol并将其绑定到viewModel的类型,并使用Document UserControl对其进行datatemplate,如下所示:

<UserControl.Resources>

        <DataTemplate DataType="{x:Type ViewModel:DocumentViewModel}">
            <View:DocumentDetailView/>
        </DataTemplate>

    </UserControl.Resources>

<ContentControl Content="{Binding MyDocumentViewModel}" />

但我不想使用控件来解决我的架构问题......

xaml :(查看第一种方法)

public partial class DocumentDetailView : UserControl
    {
        public DocumentDetailView()
        {
            InitializeComponent();

            this.DataContext = new DocumentViewModel(new Document());
        }
    }

DocumentViewModel:

 public class DocumentViewModel : ViewModelBase
    {
        private Document _document;
        private RelayCommand _saveDocumentCommand;
        private Action<Document> SaveDocumentDelegate;

        public DocumentViewModel(Document document)
        {
            _document = document;
        }

        public RelayCommand SaveDocumentCommand
        {
            get { return _saveDocumentCommand ?? (_saveDocumentCommand = new RelayCommand(() => SaveDocument())); }
        }

        private void SaveDocument()
        {
            SaveDocumentDelegate(_document);
        }        

        public int Id
        {
            get { return _document.Id; }
            set
            {
                if (_document.Id == value)
                    return;

                _document.Id = value;
                this.RaisePropertyChanged("Id");
            }
        }

        public string Name
        {
            get { return _document.Name; }
            set
            {
                if (_document.Name == value)
                    return;

                _document.Name = value;
                this.RaisePropertyChanged("Name");
            }
        }

        public string Tags
        {
            get { return _document.Tags; }
            set
            {
                if (_document.Tags == value)
                    return;

                _document.Tags = value;
                this.RaisePropertyChanged("Tags");
            }
        }
    }

更新

public class DocumentController
    {
        public DocumentController()
        {    
            var win2 = new Window2();
            var doc =  new DocumentViewModel(new DocumentPage());
            doc.AddDocumentDelegate += new Action<Document>(OnAddDocument);
            win2.DataContext = doc;
            wind2.ShowDialog();
        }

        private void OnAddDocument(Document doc)
        {
            _repository.AddDocument(doc);
        }
    }

您如何看待这个想法?

1 个答案:

答案 0 :(得分:3)

  

但是视图模型不应该知道   库。它只是一个模型   看来没什么必须意识到的   坚持等...

viewmodel将模型和视图连接在一起;它正是控制持久性的原因,尽管它不会处理持久性

我们通过使用服务将其与其他问题分开。

避免向视图模型添加持久性问题的一种方法是将这些关注点抽象到存储库接口中,以便我们可以将其作为依赖项注入。通过这种方式,我们可以在视图模型中委托持久性工作,通常是为了响应用户与视图的交互。