В моем приложении есть следующее присоединенное свойство для вызова ICommand
при загрузке UserControl
или Window
:
public static readonly DependencyProperty LoadedCommandProperty = DependencyProperty.RegisterAttached(
"LoadedCommand", typeof(ICommand), typeof(UserControlExtensions), new PropertyMetadata(null, OnLoadedCommandChanged));
private static void OnLoadedCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ContentControl userControl = d as ContentControl;
if (userControl == null)
return;
if (e.NewValue is ICommand)
{
userControl.Loaded += UserControlOnLoaded;
}
}
private static void UserControlOnLoaded(object sender, RoutedEventArgs e)
{
ContentControl userControl = sender as ContentControl;
if (userControl == null)
return;
ICommand command = GetLoadedCommand(userControl);
command.Execute(GetLoadedCommandParameter(userControl));
}
public static void SetLoadedCommand(DependencyObject element, ICommand value)
{
element.SetValue(LoadedCommandProperty, value);
}
public static ICommand GetLoadedCommand(DependencyObject element)
{
return (ICommand) element.GetValue(LoadedCommandProperty);
}
public static readonly DependencyProperty LoadedCommandParameterProperty = DependencyProperty.RegisterAttached(
"LoadedCommandParameter", typeof(object), typeof(UserControlExtensions), new PropertyMetadata(default(object)));
public static void SetLoadedCommandParameter(DependencyObject element, object value)
{
element.SetValue(LoadedCommandParameterProperty, value);
}
public static object GetLoadedCommandParameter(DependencyObject element)
{
return (object) element.GetValue(LoadedCommandParameterProperty);
}
Это просто отлично работает.В моих представлениях я называю это на UserControl
как:
AttachedProperties:UserControlExtensions.LoadedCommand="{Binding ViewLoadedCommand}"
И будет вызываться ICommand
в модели представления.
Теперь я реализовал функцию, с помощью которой я могу щелкнуть Button
в заголовке TabItem
и открыть содержимое этого TabItem
в новом окне.(Например, открепление вкладки в Visual Studio.)
Для этого я использую следующий код:
private void OpenInWindowButtonOnClick(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
if (button == null)
return;
TabItem tabItem = button.Tag as TabItem;
if (tabItem == null)
return;
string title = string.Empty;
ContentControl headerContent = tabItem.Header as ContentControl;
if (headerContent != null)
{
title = headerContent.Content.ToString();
}
string workspaceId = tabItem.Tag as string;
TabItem workspaceTab = WorkspaceTab.Items.OfType<TabItem>()
.FirstOrDefault(ti => ti.Tag is string && (string)ti.Tag == workspaceId);
if (workspaceTab != null)
{
WorkspaceWindow workspaceWindow = new WorkspaceWindow(tabItem);
workspaceWindow.Content = workspaceTab.Content;
workspaceWindow.Width = (workspaceTab.Content as FrameworkElement).ActualWidth;
workspaceWindow.Height = (workspaceTab.Content as FrameworkElement).ActualHeight;
workspaceWindow.Title = title;
workspaceWindow.Closing += WorkspaceWindowOnClosing;
workspaceWindow.Show();
workspaceWindows.Add(workspaceId, workspaceWindow);
WorkspaceTab.Items.Remove(workspaceTab);
}
}
Это также просто отлично работает.
Моя проблема сейчасесли я открою новую вкладку (в которой также есть TabControl
, где TabItem
s имеет свойстводенга-прикрепленное свойство) и переместлю эту вкладку в новое окно с кодом выше: загруженная команда не будет вызываться при переключениик представлению, в котором используется загруженное-прикрепленное свойство.
Если я отлаживаю прикрепленное свойство, я вижу, что OnLoadedCommandChanged вызывается правильно, но UserControlOnLoaded не вызывается.Если я не открою TabItem
в новом окне, UserControlOnLoaded вызывается правильно.
Любые идеи, почему загруженное событие подстраниц не срабатывает, если я перевожу TabItem
на новый Window
?