Проблемы с привязкой команд в AvalonDock - PullRequest
0 голосов
/ 10 ноября 2010

Я создал приложение, в котором к главному окну моего приложения прикреплена последовательность привязок команд:

(упрощенный код для краткости)

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

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

В ViewModel проекта есть две функции:

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

Пропуская кучу деталей, есть 3 сценария, где эта команда может быть вызвана:

  1. Как DockableContent в главном окне приложения
  2. как новый элемент управления Window, содержащий DockableContent
  3. как FloatingWindow, созданное путем «отрыва» окна через AvalonDock

Сценарии № 1 и № 2 работают отлично, используя следующую привязку команды:

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

Однако, когда я «отрываю» окно AvalonDock, кнопка отключается. Однако трассировка стека показала, что CanExecute () вызывался и возвращал true для этой кнопки ... но кнопка оставалась отключенной.

1 Ответ

1 голос
/ 11 ноября 2010

Решением было то, что привязка CommandTarget была нулевой - Application.Current.MainWindow не устанавливается, когда конструктор для MainWindow все еще вызывается.

...