Подтвердить что ты не робот

Как я могу получить доступ к элементу управления в модели mvvm в viewmodel?

У меня есть окно WPF, и в этом окне у меня есть сетка.

Я использую модель M-V-VM, и я хочу динамически добавлять TextBox в сетку в коде (в режиме просмотра)

Как получить доступ к сетке?

4b9b3361

Ответ 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()
    }
}

Ответ 2

Вы должны перенести свой код создания в View, и ViewModel должен просто уведомить представление, когда он должен быть вызван.

Ответ 3

Вы также можете использовать DataContext (который является ViewModel) представления в коде позади представления и добавить текстовое поле в сетку. Это имеет смысл.

Если вы даете сетке имя в вашем файле XAML, вы сможете сразу же получить доступ к сетке в коде.

Ответ 4

перед тем, как перейти в ViewMode, поднимите свой код и поймайте целевой элемент управления таким образом

Не оставляйте ViewModel в xaml instade, использующем обработчик событий

Это дает вам новый уровень, который вы можете построить в своей архитектуре MVVM = > MV (C) VM

Ответ 5

Если вы используете 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"; и т.д...