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:

  1. Como DockableContent dentro de la ventana principal de la aplicación
  2. Como un nuevo control de ventana, que contiene el DockableContent
  3. 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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top