Использование привязки данных в пользовательском элементе управления окна инструмента - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь создать расширение Visual Studio, которое содержит настраиваемое окно инструмента и использовать привязку данных для UserControl в окне настраиваемого инструмента, но кажется, что UserControl 'DataContext изменяется между UserControl экземпляров и когда оцениваются привязки данных.

Это код, который должен создать окно пользовательского инструмента с и UserControl с хорошим DataContext.(он находится в обработчике выполнения команды)

object futureDataContext = new object();  
YourUserControl toolWindowContent = new YourUserControl() { DataContext = futureDataContext };
// 0 for single instance tool window and true to create if it doesn't already exists
ToolWindowPane window = package.FindToolWindow(typeof(YourCustomToolWindow), 0, true);
window.Content = toolWindowContent;

Конструктор моего окна пользовательского инструмента выглядит так:

// : base(null) has been auto generated at the file's creation
public CustomTooWindow() : base(null)
{
    // I have figured out that if this.Content isn't set when exiting the constructor we get a COM exception.
    // I'm assuming it's because Visual Studio must have something to display right after the custom tool window instantiation.
    this.Content = new YourUserControl();
}

Все, что я знаю до сих пор:

-Похоже, что экземпляр окна настраиваемого инструмента, возвращаемого package.FindToolWindow()..., и экземпляр, используемый Visual Studio для реального, не совпадают.

-Если вы установили DataContext из YourUserControlв конструкторе CustomToolWindow он сохраняется

-Если я зарегистрируюсь в DataContextChanged сразу после создания экземпляра UserControl (в обработчике команд это не конструктор CustomToolWindow)никогда не срабатывает.

Как я могу наверняка получить товар DataContext на моем UserControl?

РЕДАКТИРОВАТЬ:

Я нашел обходной путь, но это не очень приятно: в классе CustomToolWindow я добавил это:

public static CustomToolWindow CurrentWindow { get; private set; }

public override void OnToolWindowCreated()
{
    CurrentWindow = this;
    base.OnToolWindowCreated();
}

public void SetContentDataContext(object newDataContext)
{
    if (Content is FrameworkElement element)
    {
        element.DataContext = newDataContext;
    }
}

1 Ответ

0 голосов
/ 17 мая 2019

Похоже, что экземпляр окна пользовательского инструмента, возвращаемого package.FindToolWindow () ... и экземпляр, используемый Visual Studio для реального, не совпадают.

Вы имеете в виду, что каждый раз, когда вы вызываете код ниже, вы получаете другой экземпляр?

ToolWindowPane window = package.FindToolWindow(typeof(YourCustomToolWindow), 0, true);

Что касается изменения DataContext, вы упоминаете между экземпляром элемента управления и привязкой данных, где вы устанавливаете DataContext элемента управления, поскольку вы не передаете никаких параметров в конструктор usercontrol, приведенный ниже.

// : base(null) has been auto generated at the file's creation
public CustomTooWindow() : base(null)
{
    // I have figured out that if this.Content isn't set when exiting the constructor we get a COM exception.
    // I'm assuming it's because Visual Studio must have something to display right after the custom tool window instantiation.
    this.Content = new YourUserControl();
}
...