Я только начал использовать следующие интерфейсы для создания облегченной инфраструктуры MVVM, предназначенной для введения управления в управление в существующем приложении.
public interface IView<C>
where C : class
{
}
public interface IView<C, VM> : IView<C>
where C : class
where VM : IViewModel
{
IDisposable Bind(VM viewModel);
}
public interface IViewModel : INotifyPropertyChanged
{
}
public interface IViewModel<M> : IViewModel
where M : class
{
IView<C> Bind<C>(M model) where C : class;
IView<C> Bind<C>(string key, M model) where C : class;
}
public interface IViewModel<VM, M> : IViewModel<M>
where VM : IViewModel<VM, M>
where M : class
{
}
Следующие интерфейсы являются примером Person
модель и модель представления.
public interface IPerson : INotifyPropertyChanged
{
string Name { get; set; }
DateTime? Dob { get; set; }
}
public interface IPersonViewModel : IViewModel<IPersonViewModel, IPerson>
{
string Name { get; set; }
DateTime? Dob { get; set; }
int? Age { get; }
string Title { get; }
}
А реализация представления, использующая только привязку данных, выглядит следующим образом:
[Factory(typeof(IView<Control, IPersonViewModel>))]
public partial class PersonView : UserControl, IView<Control, IPersonViewModel>
{
public PersonView()
{
InitializeComponent();
}
public IDisposable Bind(IPersonViewModel viewModel)
{
this.personViewModelBindingSource.DataSource = viewModel;
return Disposable.Create(() => this.personViewModelBindingSource.Dispose());
}
}
Теперь, чтобы использовать все это, я просто набрал следующий код:
var personM = context.Resolve<IPerson>();
var personVM = context.Resolve<IPersonViewModel>();
var personV = personVM.Bind<Control>(personM);
var personC = personV.AsControl();
personC.Dock = DockStyle.Fill;
this.panel1.Controls.Add(personC);
Я использую внедрение зависимостей для разрешения экземпляров моей модели, представления модели и представления. Метод Bind
модели представления разрешает представление. Все это строго типизировано и позволяет нам писать модели представлений, которые можно использовать с Windows Forms, WPF & Silverlight.
Надеюсь, вам этого будет достаточно.