Ответ 1
Используйте шаблон Supervising Controller.
Чтение:
Пример реализации для инфраструктуры CaliburnMicro MVVM показан здесь (будет работать так же для всех других платформ - или вы можете сделать это вручную, если вы делаете MVVM самостоятельно):
http://drc.ideablade.com/devforce-2012/bin/view/Documentation/cocktail-tutorial-talk-to-view
Пример:
1) Определите интерфейс IView
в котором ViewModel
(VM
) будет общаться с View
с помощью требуемого метода (ов).
public interface IView
{
void AddTextBoxToGrid();
}
2) Наследуйте код позади View
из вашего IView
и IView.AddTextboxToGrid()
метод IView.AddTextboxToGrid()
public partial class View: IView
{
public void AddTextBoxToGrid()
{
// implement here your custom view logic using standard code behind;
}
}
3) Добавьте свойство типа IView
к вашей VM
IView
public class ViewModel
{
public IView View { get; set; }
}
4) Установите свойство View
на VM
для экземпляра View
as IView
например, в коде позади:
DataContext.View = this as IView;
или в Caliburn вы можете использовать метод переопределения IScreen.OnViewAttached)
public partial class View: IView
{
public View()
{
// access you VM by the strategy of your framework or choice - this example is when you store your VM in View DataContext
(DataContext as ViewModel).View = this as IView;
}
public void AddTextBoxToGrid()
{
// implement here your custom view logic using standard code behind;
}
}
5) В вашей VM
IView.AddTextboxToGrid()
вызовите IView.AddTextboxToGrid()
public class ViewModel
{
public IView View { get; set; }
public void AddTextBoxToGrid()
{
if (View == null) return;
View.AddTextBoxToGrid()
}
}