Проблемы привязки команды в Avalondock
-
30-09-2019 - |
Вопрос
Я создал приложение, в котором есть серия привязки команд, прикрепленных к MainWindow моего приложения:
(Код упрощенного для краткости)
<Window x:Class="DBBrowser.Design.Project.ProjectView"
...>
<Window.CommandBindings>
<Commands:DataContextCommandBinding Command="ProjectCommands:ProjectRoutedCommands.OpenReferenceList" Executed="OpenReferenceList" CanExecute="CanOpenReferenceList"/>
...
</Window.CommandBindings>
</Window>
В ViewModel проекта 2 функции:
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 сценария, где можно назвать эту команду:
- В качестве DappableContent в главном окне приложения
- Как новый элемент управления окном, содержащий DockableContent
- В качестве плавучегоWindow, созданный «отрываясь» окном через 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 для этой кнопки ... но кнопка осталась отключена.
Решение
Решение было, что привязка CommandTarget была NULL - Application.Current.mainWindow не устанавливается, когда конструктор для MainWindow все еще вызывается.
Не связан с StackOverflow