Передача данных в пользовательский элемент управления в шаблоне MVVM - PullRequest
1 голос
/ 22 марта 2012

Фон:

У меня есть приложение WPF с главным окном, содержащим пользовательский элемент управления.Я хочу передать значение из главного окна пользовательскому элементу управления.

В конструкторе главного окна у меня есть код:

    public MainWindow()
    {
        InitializeComponent();
        _vm = new MainWindowViewModel();
        this.DataContext = _vm;
        ucControl = new UserControl1("NameSet");
    }

(ucControl - мой пользовательский элемент управления)

Пользовательский элемент управления имеет два конструктора:

    public UserControl1()
    {
        InitializeComponent();
        this.ID = ID.GetNewID;
    }

    public UserControl1(string name)
    {
        InitializeComponent();
        _vm = new UCViewModel(name);
        this.DataContext = _vm;
        this.ID = ID.GetNewID;
    }

Проблема в том, что хотя второй конструктор (с параметром) вызывается, он не загружается в главное окно.Я проверил идентификатор (this.ID) в загруженном событии пользовательского элемента управления и вижу, что идентификатор установлен в конструкторе по умолчанию, а его DataContext равен нулю.По этой причине в моем пользовательском элементе управления нет строки «name».

Любая помощь, пожалуйста?Поскольку я использую шаблон MVVM, я не хочу показывать свойства в пользовательском элементе управления (представление), которые должны быть установлены из главного окна только для этого.

1 Ответ

1 голос
/ 22 марта 2012

Вы дважды создаете экземпляр объекта UserControl1:

  1. Один раз в XAML. Элемент создает экземпляр объекта UserControl1, используя конструктор по умолчанию, и назначает его члену ucControl.

  2. Вы создаете его снова в конструкторе объекта MainWindow

Если вы установите точку останова в конструкторе UserControl, вы заметите, что он вызывается дважды. Я предполагаю, что WPF создает и инициализирует UserControl XAML (# 1 сверху) после назначения динамического UserControl (# 2 сверху), и поэтому вы видите первое в логическом дереве MainWindow.

У вас должен быть только один экземпляр. Если вы хотите параметризовать пользовательский элемент управления, каноническая парадигма - это то, что вы упоминаете, что вы не хотите делать (почему ??). Если у вас есть такое свойство, вы можете установить его в XAML:

отображение такого свойства - одна строка в UserControl:

public YourProperty { get; set; }

Если вы настаиваете на отсутствии этой строки, вам следует сделать следующее:

  1. Удалить пользовательский элемент управления XAML.
  2. В главном окне подписаться на событие Loaded
  3. В обработчике события Loaded создайте новый UserControl1 - с любым параметром конструктора, который вам нужен.
  4. Вручную добавить его в массив Children родительского элемента Grid

Очевидно, это не моя рекомендация. В дополнение к сложности, с первым методом вы также будете очень хорошо работать с конструктором Visual Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...