все мы, любители 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);
}
}
Что вы думаете об этой идее?