wpf - 如果存储库在 View 模型中不可用,如何从绑定(bind)到 View 模型的 DetailView 中保存数据?

标签 wpf mvvm view save viewmodel

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

但是 View 模型不应该知道存储库。它只是一个 View 模型,没有什么必须意识到持久性等......

如果在代码隐藏中设置了我的 Action 委托(delegate) SaveDocumentDelegate,我如何在 DocumentViewModel 上注册它?实际上,我应该在 DocumentController 中订阅委托(delegate),但是如何在 DocumentController 中实例化 DocumentView 并将其设置为 Datacontext 而不是在代码隐藏中执行此操作。我想到的唯一一件事是在窗口中使用内容控件并将其绑定(bind)到 viewModel 的类型并使用 Document UserControl 对其进行数据模板,如下所示:

<UserControl.Resources>

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

    </UserControl.Resources>

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

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

xml :(查看第一种方法)
public partial class DocumentDetailView : UserControl
    {
        public DocumentDetailView()
        {
            InitializeComponent();

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

文档 View 型号:
 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);
        }
    }

你怎么看这个想法?

最佳答案

But a viewmodel should not know about repositories. Its just a model of a view nothing must being aware of persistence etc...



viewmodel 将模型和 View 连接在一起;它正是控制持久性的东西,尽管它不处理持久性。

我们通过使用服务将其与其他问题解耦。

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

关于wpf - 如果存储库在 View 模型中不可用,如何从绑定(bind)到 View 模型的 DetailView 中保存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730692/

相关文章:

android - 编辑文本框未显示

postgresql - 在 Postgres 中的物化 View 上创建主键

c# - INotifyPropertyChanged 更新 ontextchange

c# - DataType 的 DataTemplate - 如何在特定的 ListBox 中覆盖此 DataTemplate?

c# - 如何通过 MVVM 在 WPF Web 浏览器控件上使用 Javascript

c# - 实现代码问题

.net - 从 WPF RichTextBox 获取 FontWeight/FontStyle/TextDecorations

c# - MVVM - 从 View 模型关闭一个窗口

wpf - 如何设置用户控件的数据上下文

android - 一键事件使所有 subview 进入按下状态