Я пытаюсь создать расширение 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;
}
}