Использование предпочтительного подхода, к которому вы стремитесь, действительно невозможно. Это потому, что ваш дизайн не оптимален. Как вы можете прочитать here ввод данных во время выполнения в компоненты вашего приложения является анти-шаблоном.
Модель для редактирования ваших пользователей - это данные времени выполнения и, таким образом, должна проходить через ваше приложение с помощью метода инъекции.
Таким образом, вы могли бы решить эту проблему, как:
public interface IViewModel<T>
{
void EditItem(T item);
}
class UserEditViewModel : IViewModel<User>
{
public void EditItem(User item)
{
// bind properties etc...
}
}
Вы обычно впрыскивают IViewModel<User>
в своем мастер-ViewModel пользователя.
На основе моделей this и this вы можете представить себе гораздо более гибкое решение. Если вы увидите редактирование пользователя как выполнение команды, которую вы просто запускаете и возвращаете, когда она будет завершена, вы можете определить инфраструктурный компонент a la the QueryProcessor
из ссылки. Это станет EditProcessor
, который обрабатывает все ваши операции редактирования в вашем приложении. Реализация довольно проста и будет выглядеть примерно так:
class EditProcessor : IEditProcessor
{
private readonly Container container;
public EditProcessor(Container container)
{
this.container = container;
}
public void EditItem<T>(T item)
{
var viewModel = typeof (IViewModel<>).MakeGenericType(typeof (T));
dynamic instance = container.GetInstance(viewModel);
instance.EditItem((dynamic) item);
}
}
Теперь везде вам нужно изменить некоторые модели, вы только инъекционные IEditProcessor
и вызвать
this.editProcessor.EditItem(yourItem);
Эта простая реализация EditProcessor
может быть продлен будет всевозможные приятные функции, такие как создание резервной копии элемента перед редактированием, поэтому пользователь может отменить редактирование, например.
Если вы используете какой-либо набор инструментов MVVM для привязки своего вида к своей модели просмотра, это также станет местом, где вы можете принести свой контейнер DI и набор инструментов MVVM с помощью латиницы.
Очень приятно, спасибо! – Carson
У меня есть вопрос по этому вопросу. Как вы думаете, как мне показалось, что я привязался к этой модели? Скажем, у меня есть окно с конструктором, который принимает IViewModel, что я должен сделать, чтобы подключить все, или мне нужно, чтобы модель модели отображала это окно? Я видел, что это случалось. Я не использую инструментарий MVVM, поэтому мне нужно все это выяснить вручную. –
Carson
Учитывая определенную модель ViewModel, как бы вы нашли правильный просмотр? У вас есть какая-то конвенция? Наверное, по твоему вопросу ты этого не делаешь. Есть несколько способов сделать это. Если вы дадите мне какое-то направление, я могу отредактировать свой ответ с некоторыми примерами. –