2010-11-10 5 views
0

j'ai créé une application où il y a une série de liaisons de commande attachée au MainWindow de ma demande:commande problèmes de liaison dans AvalonDock

(code simplifié par souci de concision)

<Window x:Class="DBBrowser.Design.Project.ProjectView" 
...> 

    <Window.CommandBindings> 
    <Commands:DataContextCommandBinding Command="ProjectCommands:ProjectRoutedCommands.OpenReferenceList" Executed="OpenReferenceList" CanExecute="CanOpenReferenceList"/> 
... 
</Window.CommandBindings> 
</Window> 

Au sein ViewModel du projet sont deux fonctions:

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); 
} 

faisant l'impasse sur un tas de détails, il y a 3 scénarios dans lesquels cette commande peut être appelée:

  1. En tant que DockableContent dans la fenêtre de l'application principale
  2. En tant que nouveau contrôle de fenêtre, contenant le DockableContent
  3. En tant que FloatingWindow, créé par "arracher" la fenêtre via AvalonDock

Scénario # 1 et 2 fonctionnent parfaitement en utilisant la commande de liaison suivante:

<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"/> 

Cependant, lorsque je "déchire" le A ValonDock fenêtre, le bouton grise. Cependant, une trace de pile a montré que CanExecute() était appelé ET renvoyait vrai pour ce bouton ... mais le bouton est resté désactivé.

Répondre

1

La solution était que la liaison CommandTarget était null - Application.Current.MainWindow n'est pas définie lorsque le constructeur de MainWindow est toujours appelé.

Questions connexes