Comando Encuadernación problemas en AvalonDock
-
30-09-2019 - |
Pregunta
He creado una aplicación donde hay una serie de enlaces de mando unido al MainWindow de mi solicitud:
(código simplificado por razones de brevedad)
<Window x:Class="DBBrowser.Design.Project.ProjectView"
...>
<Window.CommandBindings>
<Commands:DataContextCommandBinding Command="ProjectCommands:ProjectRoutedCommands.OpenReferenceList" Executed="OpenReferenceList" CanExecute="CanOpenReferenceList"/>
...
</Window.CommandBindings>
</Window>
Dentro de modelo de vista del proyecto son dos funciones:
public bool CanOpenReferenceList(object parameter)
{
return true;
}
public void OpenReferenceList(object parameter)
{
var dockedReferenceList = new DockableUniversalListView()
{
Name = "referenceList",
Title = "Reference List"
};
referenceData = dockedReferenceList.DataContext as ReferenceListViewModel;
if (referenceData != null) referenceData.EvListSelected += WoWObjectListRecieved;
DockedWindows.Add(dockedReferenceList);
}
El saltar sobre un montón de detalles, hay 3 escenarios en los que este comando se puede llamar:
- Como DockableContent dentro de la ventana principal de la aplicación
- Como un nuevo control de ventana, que contiene el DockableContent
- Como FloatingWindow, creado por "arrancar" la ventana a través de AvalonDock
Escenario # 1 y # 2 funcionan a la perfección con el siguiente comando de unión:
<Button Margin="2" Content="Validate" Height="23" Name="Validate" Width="75"
Command="ProjectCommands:ProjectRoutedCommands.OpenReferenceList"
CommandTarget="{Binding Path=MainWindow.DataContext,Source={x:Static Application.Current}}"
DockPanel.Dock="Left"
CommandParameter="{Binding Path=SelectedWoWObjectList}"
TabIndex="20" HorizontalAlignment="Right"/>
Sin embargo, cuando "Tear Off" la ventana AvalonDock, el botón se pone gris. Sin embargo, un seguimiento de pila mostró que CanExecute () estaba siendo llamado y devolver cierto para ese botón ... pero el botón permaneció desactivada.
Solución
La solución era que la unión era nula CommandTarget - Application.Current.MainWindow no se establece cuando el Constructor para la MainWindow todavía se está llamando.