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つのシナリオがあります。
- アプリケーションのメインウィンドウ内のドッカブルコンテンツとして
- ドッカブルコンテンツを含む新しいウィンドウコントロールとして
- Avalondock経由で窓を「引き裂く」ことによって作成されたFloatingWindowとして
シナリオ#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.current.mainwindowであったことでした。
所属していません StackOverflow