Как сохранить данные из DetailView, привязанного к ViewModel, если хранилище не используется в viewmodel? - PullRequest
1 голос
/ 17 сентября 2010

все мы, любители mvvm, знаем образец mvvm Джоша Смита и то, как он сохранил клиента в подробном представлении клиента, вставив объект репозитория в конструктор customerViewModel.

Но модель представления не должна знать о репозиториях,Это просто модель представления, о котором не нужно знать, что такое постоянство и т. Д. ...

Как я могу зарегистрировать мой делегат Action SaveDocumentDelegate в DocumentViewModel, если он установлен в коде позади?На самом деле я должен подписать делегата в моем DocumentController, но как я могу создать экземпляр DocumentView в моем DocumentController и установить его как Datacontext, не делая этого в коде позади.Единственное, что мне пришло в голову, - это использовать contentcontrol в окне и привязать его к типу viewModel и затем преобразовать его в Document UserControl следующим образом:

<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 Ответ

3 голосов
/ 17 сентября 2010

Но модель представления не должна знать о Хранилища. Это просто модель смотреть ничего не должен знать настойчивость и т.д ...

Viewmodel соединяет модель и вид вместе; это именно то, что контролирует постоянство, хотя оно не обрабатывает постоянство .

Мы отделяем это от других проблем с помощью услуг.

Один из способов избежать добавления проблем постоянства в модель представления - это абстрагировать эти проблемы в интерфейсы репозитория, чтобы мы могли внедрить его как зависимость. Таким образом, мы можем делегировать постоянную работу в модели представления, обычно в ответ на взаимодействие пользователя с представлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...