У меня есть окно WPF, и в этом окне у меня есть сетка.
Я использую модель M-V-VM, и я хочу динамически добавлять TextBox в сетку в коде (в режиме просмотра)
Как получить доступ к сетке?
У меня есть окно WPF, и в этом окне у меня есть сетка.
Я использую модель M-V-VM, и я хочу динамически добавлять TextBox в сетку в коде (в режиме просмотра)
Как получить доступ к сетке?
Используйте шаблон 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()
}
}
Вы должны перенести свой код создания в View, и ViewModel должен просто уведомить представление, когда он должен быть вызван.
Вы также можете использовать DataContext (который является ViewModel) представления в коде позади представления и добавить текстовое поле в сетку. Это имеет смысл.
Если вы даете сетке имя в вашем файле XAML, вы сможете сразу же получить доступ к сетке в коде.
перед тем, как перейти в ViewMode, поднимите свой код и поймайте целевой элемент управления таким образом
Не оставляйте ViewModel в xaml instade, использующем обработчик событий
Это дает вам новый уровень, который вы можете построить в своей архитектуре MVVM = > MV (C) VM
Если вы используете Caliburn Micro, выполните следующий шаг:
Сделать ViewModel унаследованным от интерфейса IViewAware
; вы собираетесь реализовать два метода AttachView и GetView этого интерфейса.
Определите переменную с типом представления, чтобы получить ссылку на представление
Смотрите ниже:
private SomeViewClass v;
public void AttachView(object view, object context = null)
{
v = view as BomView;
if (ViewAttached != null)
ViewAttached(this,
new ViewAttachedEventArgs() { Context = context, View = view });
}
public object GetView(object context = null)
{
return v;
}
Позже вы можете получить доступ к одному элементу в представлении через v, например v.txtName = "John"; и т.д...